📖 문제
🧑🏻💻 풀이 과정
1) 문제 이해 및 접근
키가 회전이 가능하므로 회전했을때 모습을 구하였습니다.
키를 자물쇠 가장 오른쪽 하단부터 한칸씩 이동하며 열수 있는지 없는지 판별하였습니다.
2) 알고리즘
- 구현
3) 풀이 코드
사용 언어 - Python
def solution(key, lock):
K, L = len(key), len(lock) # 키와 자물쇠의 한변의 길이
keys = [[[0] * K for _ in range(K)] for _ in range(4)] # 회전한 키의 모양들을 담을 리스트
for i in range(K):
for j in range(K):
keys[0][i][j] = key[i][j] # 정방향
keys[1][i][j] = key[K-1-j][i] # 90도 회전
keys[2][i][j] = key[K-1-i][K-1-j] # 180도 회전
keys[3][i][j] = key[j][K-1-i] # 270도 회전
def can_open(y, x): # 자물쇠를 열 수 있는지 확인하는 함수
r, c = y, x # 키 정보가 담긴 배열의 행과 열
for i in range(L): # 자물쇠의 크기만큼 반복
for j in range(L):
if 0 <= r < K and 0 <= c < K: # 키의 인덱스가 배열 내의 범위라면
if lock[i][j] and keys[t][r][c]: # 자물쇠와 키가 돌기라면, False 반환
return False
elif not lock[i][j] and not keys[t][r][c]: # 자물쇠와 키가 홈이라면, False 반환
return False
elif not lock[i][j]: # 자물쇠가 홈이라면, False 반환
return False
c += 1 # 열 인덱스 증가
c = x # 새로운 행이므로 열 초기값으로 다시 할당 및 행 증가
r += 1
return True # 자물쇠를 열 수 있다면, True 반환
for y in range(-L, K): # 키가 오른쪽 아래부터 시작
for x in range(-L, K):
for t in range(4): # 회전한 4개의 키를 모두 확인해야함
if can_open(y, x): # 자물쇠를 열 수 있다면 True 반환하며 종료
return True
return False # 자물쇠를 열 수 없다면 False 반환
print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]], [[1, 1, 1], [1, 1, 0], [1, 0, 1]]))
📝 결과 및 학습한 내용
1) 어려웠던 내용
회전한 키의 모양을 만들기 위한 인덱스 관리와, 자물쇠에 열쇠를 맞추어 보기 위한 인덱스 관리에 다소 어려움을 겪었습니다.
2) 새롭게 학습한 내용
특별히 없습니다.
🔗 문제 링크
- https://programmers.co.kr/learn/courses/30/lessons/60059
※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
[프로그래머스] 불량 사용자 (0) | 2022.02.16 |
---|---|
[프로그래머스] 보석 쇼핑 (0) | 2022.02.15 |
[프로그래머스] 길 찾기 게임 (0) | 2022.02.13 |
[백준] 13549 숨바꼭질 3 (0) | 2022.02.12 |
[백준] 1701 Cubeditor (0) | 2022.02.11 |
댓글