CodingTest/Programmers
[ 프로그래머스 ] 자물쇠와 열쇠
EEOOOO
2022. 7. 1. 00:35
/ 제출 1 /
def solution(key, lock):
answer = False
# 키 끼워넣을 공간 위해서 Lock늘려주기
n = len(lock)
new_lock = [[0]*(n+2*(n-1)) for _ in range(n+2*(n-1))]
for i in range(n):
for j in range(n):
new_lock[n-1+i][n-1+j] = lock[i][j]
# 키 4방향으로 확인
for i in range(4):
key = list(map(list, rotate_key(key))) # 시계반대방향회전
answer = push(key, new_lock)
if answer:
break
return answer
def rotate_key(key):
return list(reversed(list(zip(*key))))
def push(key, lock):
start = len(key) -1
find = False
lock_save = lock
for x in range(len(lock)-len(key)):
for y in range(len(lock)-len(key)):
for i in range(len(key)):
for j in range(len(key)):
lock[x+i][y+j] += key[i][j]
new_lock = []
for i in range(len(key)):
new_lock.append(lock[i+len(key)-1][len(key)-1:2*len(key)-1])
if check(new_lock):
return True
for i in range(len(key)):
for j in range(len(key)):
lock[x+i][y+j] -= key[i][j]
return False
def check(lock):
for i in range(len(lock)):
for j in range(len(lock)):
if lock[i][j] != 1:
return False
return True
채점 결과
정확성: 56.0
합계: 56.0 / 100.0
2, 4, 6, 7, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 38 실패
하.. 이정도는 풀어야 하는거 아닌가.. 한 번 풀어봤던 문제인데.. 속상..
/ 다른 분 풀이 /
def rotate_a_matrix_by_90_degree(a):
n = len(a)
m = len(a[0])
result = [[0] * n for _ in range(m)]
for i in range(n):
for j in range(m):
result[j][n - i - 1] = a[i][j]
return result
def check(new_lock):
lock_length = len(new_lock) // 3
for i in range(lock_length, lock_length * 2):
for j in range(lock_length, lock_length * 2):
if new_lock[i][j] != 1:
return False
return True
def solution(key, lock):
n = len(lock)
m = len(key)
new_lock = [[0] * (n * 3) for _ in range(n * 3)]
for i in range(n):
for j in range(n):
new_lock[i + n][j + n] = lock[i][j]
for rotation in range(4):
key = rotate_a_matrix_by_90_degree(key)
for x in range(n * 2):
for y in range(n * 2):
for i in range(m):
for j in range(m):
new_lock[x + i][y + j] += key[i][j]
if check(new_lock) == True:
return True
for i in range(m):
for j in range(m):
new_lock[x + i][y + j] -= key[i][j]
return False