Notion에서 작성한 글이라, 여기 에서 더 깔끔하게 보실 수 있습니다! 😮😊
2기 3일차에 풀었던 문제로, Queue 문제이다.
당시에는 Queue가 FIFO다~ 정도만 알았지, 문제의 흐름에서 자연스럽게 Queue가 보이지도 않았고, Queue를 사용한 이유를 설명하라면 아마 버벅거렸을 것이다.
하지만 이제 여러 가지 방법들이 보인다! 😮😊
def solution(arr):
queue = []
for n in arr:
if queue[-1:] != [n]:
queue.append(n)
return queue
queue[-1] == n
이 아닌 queue[-1:]
로 슬라이싱을 사용한 이유는, 반복문에 처음 진입할 땐 queue
가 비어 있는 상태이기 때문에 [-1]
로 접근할 경우 IndexError가 발생하기 때문이다. 슬라이싱을 사용하면 유효한 인덱스에 대해서만 슬라이싱하기 때문에 IndexError가 발생하지 않는다.arr
의 크기가 자연수이므로 항상 queue
에는 arr[0]
이 push됨이 보장되기 때문에 미리 queue
에 첫 번째 원소를 넣어놓고 시작을 할 수도 있다.def solution(arr):
a_set = set()
answer = []
for n in arr:
if n not in a_set:
a_set = set(n)
answer.append(n)
return answer
answer
에 추가되었지만, 뒤에서 한 번 더 들어오는 경우를 처리하기 위해 새로운 n
이 들어올 때마다 set을 초기화시켜준다. 집합을 이용하여 만에 연속적으로 나타난 숫자인지 아닌지 판별할 수 있다.def solution(arr):
temp = -1
answer = []
for n in arr:
if n != temp:
temp = n
answer.append(n)
return answer
from itertools import groupby
def solution(arr):
return [key for key, group in groupby(arr)]
BOJ 11729. 하노이 탑 이동 순서 과 동일한 재귀 문제이다.
점화식 도출 과정과 DP를 이용한 최적화까지 설명하고 싶은데 어제 시험도 보고 백준도 풀다보니 밤을 새서… 내일 이어서 작성하겠다 😢
def f(n, s, d):
if n == 1: return [[s, d]]
return f(n-1, s, 6-(s+d)) + [[s, d]] + f(n-1, 6-(s+d), d)
def solution(n):
return f(n, 1, 3)
memo = {}
def f(n, s, d):
if n == 1: return [[s, d]]
if (n, s) in memo: return memo[(n, s)]
memo[(n, s)] = f(n-1, s, 6-(s+d)) + [[s, d]] + f(n-1, 6-(s+d), d)
return memo[(n, s)]
def solution(n):
return f(n, 1, 3)