상세 컨텐츠

본문 제목

자물쇠와 열쇠

코딩테스트/구현

by 수타. 2023. 6. 12. 20:01

본문

https://school.programmers.co.kr/learn/courses/30/lessons/60059

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제요약:

1과0으로 이루어진 2차원 자물쇠와 열쇠가 있을 때, 키로 열 수 있으면 True 아니면 Fasle를 반환.(회전가능)

난이도3

 

소요시간: 

45분

 

1차시도:

def turn_90(arr):
	return [i[::-1] for i in zip(*arr)]
	
def zero_padding(n,m,lock):		
	temp = [[0]*(n+2*(m-1)) for _ in range(n+2*(m-1))]							  
	for i in range(m-1,m-1+n):
		temp[i] = [0]*(m-1) + lock[i-(m-1)] + [0]*(m-1)
	return temp
	
def solution(key,lock):
	#m 은 key 크기 n 은 lock크기
	m = len(key)
	n = len(lock)
	
	for _ in range(4):
		key = turn_90(key)
		for i in range(n+m-1):
			for j in range(n+m-1):
				#i,j 는 lock내부에서 key의 시작점
				piv = 0
				temp = zero_padding(n,m,lock)
				for y in range(m):
					for x in range(m):
						#y,x는 옮겨다니는 key내부
						temp[y+i][x+j] += key[y][x] 
				#다 더한뒤
				piv = 0
					
				for ny in range(m-1,m-1+n):
					for nx in range(m-1,m-1+n):
						if temp[ny][nx] != 1:
							piv =1
							break
					if piv:
						break
				else:
					return True
						
	else:	
		return False

print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]],[[1, 1, 1], [1, 1, 0], [1, 0, 1]]))

먼저 90도 회전을 오랜만에 생각해서 시간을 좀 소요했고(암기하자) , 제로패딩을 할때 0을 넣을 생각하지 말고 큰 0판에 가운데에 lock을 넣는게 훨씬 빠르게 풀었을 것 같다. ( 2(n-m+1) ) 해결하는데 10분 사용한듯함 주의하자)

나머진 시작지점 계속 바꿔주면서 임시에 더한 후, 원래 lock부분만 때와서 전부 1이면 True를 반환했다.

 

'코딩테스트 > 구현' 카테고리의 다른 글

퍼즐 조각 채우기  (0) 2023.06.30
프렌즈4블록  (0) 2023.06.28
  (0) 2023.06.15
아기상어  (0) 2023.06.09
문자열 압축  (1) 2023.06.02

관련글 더보기