
먼저 구현문제를 풀 때 사용했던 개념들을 정리하고, 구현 문제에서 어려웠던 부분을 정리하겠다.
zip함수는 조금 특이하다. 동일한 개수로 만들어진 자료형을 묶어주는 역할을 하는데, 리스트와 딕셔너리 형식으로 출력이 가능하다.
# 입력값
num = [1, 2, 3]
fruit = ['apple', 'banana', 'orange']
color = ['red', 'yellow', 'orange']
print(list(zip(num, fruit, color)))
# 결과값
[(1, 'apple', 'red'), (2, 'banana', 'yellow'), (3, 'orange', 'orange')]
# for문 사용 예제
for a, b in zip(range(2), range(2)):
print(a, b)
# 출력값
0 0
1 1
2 2
# 딕셔너리를 만드는 예제
dict_num = { x:y for x, y in zip(range(10),range(10))}
리스트 comprehension과 같이 사용하면 좋을 듯 하다.
코테 문제를 풀다보면 자꾸 익숙한 리스트, 딕셔너리, 튜플 같은 자료형만 사용하게 되는데 큐, 덱이 있다는 걸 깜빡하지 않았으면 좋겠다.
from queue import Queue
queue = Queue()
queue.put('a')
queue.put('b')
queue.get() # 'a'
내장함수 put, get을 이용하여 선입선출 구조를 구현할 수 있다는 점이 특징이다.
< Deque에 존재하는 메서드 >
1. deque.append(item) : 오른쪽 끝 item 삽입
2. deque.appendleft(item) : 왼쪽 끝 item 삽입
3. deque.pop() : 오른쪽 끝 삭제
4. deque.popleft() : 왼쪽 끝 삭제
5. deque.extend(array) : array를 순환하면서 오른쪽에 추가
6. deque.extendleft(array) : array를 순환하면서 왼쪽에 추가
7. deque.rotate(i) : deque을 i만큼 회전
=> deque.rotate 사용방법
from collections import deque
dequeObject = deque()
dequeObject.extend([1, 2, 3, 4])
dequeObject.rotate(1)
print(dequeObject)
## deque([2, 3, 4, 1])
푸는 아이디어
: 오른쪽으로 90도 회전하는 함수 / 크기를 세 배로 한 새로운 자물쇠를 만든 뒤 그 새로운 자물쇠의 중간 부분(원래 크기)이 모두 채워지는지(1이 되는지) 확인하는 함수
: 이 두개의 함수를 만들어야겠다는 아이디어가 있으면 좋다.
: 90도 회전을 네번 시켜보는 건 반복문을 이용해 구현하였다.
:
def rotate_a_matrix_by_90_degree(a):
n = len(a) #행길이 계산
m = len(a[0]) #열길이 계산
result = [[0]*m 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): # 새로 만든 자물쇠의 중간 부분이 모두 1인지 확인
lock_length = len(new_lock)//3 # 크기를 세배 했으므로 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: # 1이 아닌 부분이 나오면 false
return False
return True # 새로운 자물쇠 중간부분이 모두 1이면 True
def solution(key, lock):
n = len(lock)
m = len(key)
new_lock = [[0] * (n*3) for _ in range(n*3)] # 자물쇠의 크기를 기존의 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): # 자물쇠 부분 # n의 3배가 아닌 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