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

lock을 3배 넓게 하는것을 생각하는게 핵심인 문제같습니다.

자물쇠는 4회전 가능하고 각 회전마다 넓어진 lock안에서 이동하며 잠금해제가 가능한지 파악합니다.

 

알고리즘

1. lock을 3배 넓히고 가운데에 진짜 lock을 위치시킨다.

2. key를 90도 회전 4번 하고, 각 회전마다 넓어진 lock 안에서 이동하며 잠금해제 여부 파악한다.

2-1 좌측 상단 부터 평행이동 하는 key가 가운데 진짜 lock 부분에 겹쳤을 때마다 잠금해제 여부 파악

2-2 잠금해제 여부 파악은 가운데 진짜 lock 부분이 돌기끼리 겹쳐있는지, 빈 홈이 있는지 파악하는 것.

3. 4회전 모두 끝나고 answer 리턴.

 

* key가 lock에 맞는 키인지 확인하는 방법은

돌기가 1이고 홈이 0이므로

돌기끼리 만나면 1+1=2, 돌기와 홈은 1+0=1, 홈과 홈은 0+0=0

이렇게 key와 lock 을 더해보면 상태를 알 수 있다.

 

* key를 넓어진 lock 전체를 탐색하게 하고 가운데에 겹쳤을 때마다 isUnlock() 을 사용해 잠금해제 파악하는데,

이때 진짜 lock 전체를 검사해야 key와 닿지 않은곳에 채우지 못 한 홈(0)이 있는지 확인할 수 있다.

 

+ Recent posts