본문 바로가기
코딩/이코테-파이썬

이코테 구현: 자물쇠와 열쇠

by 철없는민물장어 2022. 8. 29.
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

댓글