구현 문제 정리

seulg1004·2021년 7월 24일
0

PythonAlgorisim

목록 보기
1/14
post-thumbnail

먼저 구현문제를 풀 때 사용했던 개념들을 정리하고, 구현 문제에서 어려웠던 부분을 정리하겠다.

파이썬 내장 함수, 모듈

zip?

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과 같이 사용하면 좋을 듯 하다.

큐, 덱?

코테 문제를 풀다보면 자꾸 익숙한 리스트, 딕셔너리, 튜플 같은 자료형만 사용하게 되는데 큐, 덱이 있다는 걸 깜빡하지 않았으면 좋겠다.

  • Queue : 데이터를 넣고 빼는 방향이 따로 정해져 있다.
    구현할 수 있는 방향은
  1. list 형식으로 사용하기
  2. 모듈 사용하기
    정도가 있다.
    먼저 리스트 형식은 파이썬 리스트와 동일하고(리스트는 차후에 계속 정리해야겠다..) 모듈을 사용하는 방법은
from queue import Queue

queue = Queue()
queue.put('a')
queue.put('b')

queue.get() # 'a'

내장함수 put, get을 이용하여 선입선출 구조를 구현할 수 있다는 점이 특징이다.

  • Deque : 데이터를 넣고 빼는 방향을 사용자가 정할 수 있다.
    collections 모듈을 사용하여 deque을 사용할 수 있다.

< 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

0개의 댓글