2020 카카오 블라인드 채용 코테 기출문제 자물쇠와 열쇠 풀이
어려운 아이디어 보다는 쌩 구현력을 묻는 문제로, 리스트가 왔다갔다 하는 상황이 많아서, 어떻게 대처해야 할지를 잘 고려해야 하는 문제이다. 함수로 잘 쪼개야 한다. 다행히 좌표 장난질은 덜하되,
알고리즘
(1) 일단, 열쇠가 삐져나와도, 구멍에만 정확하게 맞게 끼워주면 된다는 의미는, 열쇠가 바깥으로 벗어날 수 있다는 점이다.따라서, 자물쇠의 판을 넓혀서 양쪽으로 열쇠가 자연스럽게 들어갈 수 있게 해주자.
(2) 열쇠를 1번 돌려서 넓게 핀 자물쇠칸 각 칸에 모두 꽂아보고, 안되면 열쇠 돌리고 총 열쇠를 4번 돌려서 다 안되면 실패로 False를 return 해버린다. 이 때, 자물쇠의 첫 칸을 변수로 줘서 다음 번 시도에도 편리하게 넣을 수 있도록 해주자.
(3) 열쇠를 넣는 함수, 빼는 함수, 체크하는 함수, 돌리는 함수를 모두 구분해서 넣으면 깔끔하다.
코드
def attach_key(x, y, k_size, key, lock_board):
for i in range(k_size):
for j in range(k_size):
lock_board[x+i][y+j] += key[i][j]
return lock_board
def detach_key(x, y, k_size, key, lock_board):
for i in range(k_size):
for j in range(k_size):
lock_board[x+i][y+j] -= key[i][j]
return lock_board
def correct_lock(lock_board, k_size, l_size):
for i in range(l_size):
for j in range(l_size):
if lock_board[i+k_size][j+k_size] != 1:
return False
return True
def rotation(key):
return list(zip(*key[::-1]))
def solution(key, lock):
# 0단계 변수 선택
k_size, l_size = len(key), len(lock)
lock_board = [[0 for _ in range(2*l_size + k_size)] for _ in range(2*l_size + k_size)]
# 1단계. 초기 보드 세팅, 자물쇠 중앙 배치
for i in range(0, l_size):
for j in range(0, l_size):
lock_board[i+k_size][j+k_size] = lock[i][j]
# 2단계 key의 회전과 이동
for _ in range(4):
key = rotation(key)
for x in range(0, l_size+k_size):
for y in range(0, l_size+k_size):
lock_board = attach_key(x, y, k_size, key, lock_board)
if correct_lock(lock_board, k_size, l_size):
return True
lock_board = detach_key(x, y, k_size, key, lock_board)
return False
'알고리즘 & PS' 카테고리의 다른 글
[Python] 프로그래머스 Lv 2 - 게임 맵 최단거리 (0) | 2021.04.26 |
---|---|
[Python] 프로그래머스 Lv 4 - 버스여행 (0) | 2021.04.25 |
[Python] 프로그래머스 Lv 2 - 최대 용량이 정해진 FIFO 큐 클래스 (0) | 2021.04.24 |
[Python] 프로그래머스 Lv 3 - 게임아이템 (0) | 2021.04.23 |
[Python] 프로그래머스 Lv 3 - 방문 길이 (0) | 2021.04.23 |