728x90
반응형
def solution(key, lock):
answer = False
new_lock=[[0]*(2*len(key)-2+len(lock))for i in range(2*len(key)-2+len(lock))]
for i in range(len(lock)):
for j in range(len(lock)):
new_lock[len(key)-1+i][len(key)-1+j]=lock[i][j]
for i in range(len(key)-1+len(lock)-1): #열쇠 가로로 이동
for j in range(len(key)-1+len(lock)-1): #열쇠 세로로 이동
for k in range(4): #회전 4번
key=turn_90(key) #키 회전
#키 맞춰보기
for a in range(len(key)):
for b in range(len(key)):
new_lock[i+a][j+b]+=key[a][b]
#검증
answer=True
for a in range(len(lock)):
for b in range(len(lock)):
if new_lock[len(key)-1+a][len(key)-1+b]!=1:
answer=False
if answer==True:
return True
else:#틀린경우 원상복구 하고 다음시도
for a in range(len(key)):
for b in range(len(key)):
new_lock[i+a][j+b]-=key[a][b]
continue
return False #반복을 다 끝냈는데 리턴값이 없는경우 맞는 키가 아님
def turn_90(key): #행과 열을 바꿔서 90도 회전
length=len(key)
result=[]
for i in range(length):
tmp=[]
for j in range(length-1,-1,-1):
tmp.append(key[j][i])
result.append(tmp)
return result
key=[[0,0,0],[1,0,0],[0,1,1]]
lock=[[1,1,1],[1,1,0],[1,0,1]]
print(solution(key,lock))
답안을 슬쩍 본 후..
직접 짜봤다
내생각에는 new_lock을 안 만들고 그냥 lock에다가 더해서 구현할 수 있을 것 같은데.
복잡해서 일단 나도 큰 크기의 new_lock을 만들었다
이렇게 가로,세로의 길이가 2*len(key)-2+len(lock)이 되는 new_lock을 만든다
중앙에는 lock이 있고.. 저 범위 내에서 key가 이리저리 움직일 수 있다
key가 움직일 범위를 지정했다
key가 1x1짜리가 아니니까.. 범위를 넘어갈수도 있기 때문에
나는 key의 0,0좌표를 기준으로 new_lock에서 어디까지 움직일 수 있나 계산해서 반복문 범위에 사용했다
결론은 len(key)-1+len(lock)-1만큼 움직인다 가로,세로로
움직인 다음 회전을 하고
자물쇠를 맞춰보고
맞다면 return True
아니라면 자물쇠 맞췄던 걸 다시 원상복구 시키고 다음 반복을 진행한다
참고로 작동 안될수도있다 내코드는..;;몇개의 답만 확인하고 제출을 못해봤다
728x90
반응형
'코딩 > 이코테-파이썬' 카테고리의 다른 글
구현: 기둥과 보 설치 (python) (0) | 2022.08.31 |
---|---|
이코테: 구현 - 자물쇠와 열쇠 (0) | 2022.08.29 |
문자열 압축 (0) | 2022.08.28 |
무지의 먹방라이브 (2) | 2022.08.24 |
알고리즘 기출문제: 그리디2 (1) | 2022.08.17 |
댓글