Algorithm/프로그래머스
[프로그래머스] 자물쇠와 열쇠 - python (2020 카카오 블라인드 코딩테스트)
댕경
2021. 11. 2. 15:10
728x90
https://programmers.co.kr/learn/courses/30/lessons/60059
코딩테스트 연습 - 자물쇠와 열쇠
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true
programmers.co.kr
문제
열쇠를 자물쇠에 맞춰라.
열쇠는 회전이 가능하다.
해결
함수 구성
1. rotate
: 90 도 회전 함수
2. attach
: new_lock 에 key 값을 넣어준다
3. check
: lock 의 값이 모두 1인지 판별한다
4. detach
: 모두 1이 아니라면 원래의 new_lock으로 되돌려 준다
5. solution (main 함수)
설명
우선, 열쇠가 다 들어 갈 수있는 "lock" 3배 크기의 "new_lock" 을 만들어준다.
가운데에 lock을 위치 시켜준뒤 그 곁을 key 가 반복문으로 순회하며 맞는지 판단한다. ( attach + check )
맞지 않는다면 다시 원래의 new_lock으로 되돌려 준다 . ( detach )
한바퀴 순회했을 때 답이 없다면 90도 회전한뒤 다시 실행한다. ( rotate )
코드
def rotate(a): # 90도 회전 함수
n = len(a)
result = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
result[j][n - i - 1] = a[i][j]
return result
def attach(i,j,key_len,new_lock,key): # new_lock에 넣어보기
for x in range(key_len):
for y in range(key_len):
new_lock[x+i][y+j]+=key[x][y]
def check(new_lock,lock_len): # lock 이 풀리나 check
for i in range(lock_len, lock_len*2):
for j in range(lock_len,lock_len*2):
if new_lock[i][j]!=1 :
return False
return True
def detach(i,j,key_len,new_lock,key): # new_lock에서 다시 없애기
for x in range(key_len):
for y in range(key_len):
new_lock[x+i][y+j]-=key[x][y]
def solution(key, lock):
key_len = len(key)
lock_len = len(lock)
new_lock = [[0] * (lock_len * 3) for _ in range(lock_len * 3)]
for i in range(lock_len): # 중앙에 lock 위치
for j in range(lock_len):
new_lock[i + lock_len][j + lock_len] = lock[i][j]
for _ in range(4):
key = rotate(key) # 90도 회전
for i in range(1, lock_len*2):
for j in range(1, lock_len*2):
attach(i,j,key_len,new_lock,key) # new_lock + key
if check(new_lock,lock_len):
return True
else:
detach(i,j,key_len,new_lock,key) # new_lock - key
return False