https://programmers.co.kr/learn/courses/30/lessons/60059
2020 KAKAO 문제
간과했던 내용
- Lock과 Key의 크기가 다를 수 있던 점
- Board(전체 배열)의 크기는 Lock의 2배가 아닌 3배여야 한다는 점
- 회전 배열이 바로 안떠올랐던 점(값을 적어서 확인해봄)
- 돌기끼리 부딪혀도 안된다는 점(무조건 매끄러운 1이 되야함, 2도 안됨)
풀이
- 자물쇠 3배 크기의 전체 배열을 구성한다.
- 해당 전체 배열에서 자물쇠를 중간(start~end) 부분에 값을 옮긴다.
- 그리고 키를 움직이고 또 회전하며 자물쇠 영역이 전부 1이 되는지 체크한다.
# 배열 rotation
def rotation(arr):
retArr = [[0] * len(arr) for _ in range(len(arr))]
# 11 > 13 / 12 > 23 / 13 > 33
for i in range(len(arr)):
for j in range(len(arr)):
retArr[j][len(arr)-1-i] = arr[i][j]
return retArr
# 정값 체크
def checkSol(keyArr, lockArr, x, y):
keySize = len(keyArr)
lockSize = len(lockArr)
boardSize = lockSize*3
board = [[0]*(boardSize) for _ in range(boardSize)]
start = lockSize -1
end = start + lockSize
# boardArr 에 lock 삽입
for i in range(lockSize):
for j in range(lockSize):
board[start+i][start+j] += lockArr[i][j]
# boardArr 에 key 삽입
for i in range(keySize):
for j in range(keySize):
board[i+x][j+y] += keyArr[i][j] # 값 복사
# 전부 1인지 체크
for i in range(start, end):
for j in range(start, end):
if board[i][j] != 1 :
return False
return True
# 메인함수
def solution(key, lock):
# 4회전 하면서 체크
for _ in range(4):
# 값 이동
for x in range((len(lock)*2)-1):
for y in range((len(lock)*2)-1):
if checkSol(key, lock, x, y) == True :
return True
# key 회전
key = rotation(key)
return False
'Archived(CSE Programming) > 알고리즘(Python)' 카테고리의 다른 글
프로그래머스 - 구명보트(파이썬, LV2) / 그리디(Greedy) (0) | 2020.10.03 |
---|---|
프로그래머스 - 큰 수 만들기(파이썬, LV2) / 그리디(Greedy) (0) | 2020.10.03 |
프로그래머스 - 조이스틱(파이썬, LV2) / 그리디(Greedy) (1) | 2020.09.29 |
프로그래머스 - 순위(파이썬, LV3) (0) | 2020.09.29 |
프로그래머스 - 가장 긴 팰린드롬(파이썬, LV3) (0) | 2020.09.16 |