지난 3주차에서는 NH 단계의 DP를 학습했다. 이전 주차들과 달리 해설을 봤던 문항들이 많았으며, 직접 코드를 구현해보지 않아 경험이 부족함을 많이 느꼈다.
슬프게도 진단 점수가 하락했다. 특히 DFS 유형으로 분류되는 실력진단 문제에서 return 문을 잘못된 부분에 작성해 다음 문제로 넘어가지 못했는데 뒤늦게 알아차린 것이 가장 아쉬웠다. (DP 유형 문제를 실력진단에서 꼭 만나보고 싶었는데 다음 주차엔 꼭 풀어보고 말겠다.)
동일하게 DFS/BFS 유형에 대해 부족하다는 결과를 받았다 😥
(이미지출처:https://howtolivelikehuman.tistory.com/75)
문제 1, 2
마을 구분하기
(링크 : https://www.codetree.ai/missions/2/problems/seperate-village?&utm_source=clipboard&utm_medium=text)안전 지대
(링크 : https://www.codetree.ai/missions/2/problems/comfort-zone?&utm_source=clipboard&utm_medium=text)리뷰 1
1) 첫 풀이와 개선점
리뷰 2
1) 2차원 배열의 max/min 값 찾기
map()
함수를 이용하여 간편하게 찾을 수 있었다.max(map(max, iterable object))
2) maximum recursion depth exceeded
에러
import sys
sys.setrecursionlimit(2500)
3) 첫 풀이와 개선점
풀이 pseudo code
from collections import deque
grid 입력으로 주어지는 격자
visitied 방문 여부를 저장할 격자
answer 방문 순서를 저장할 격자
order = 1 방문 순번
que = deque()
dxs = [방향전환]
dys = [방향전환]
def possible(x, y):
if 격자 범위 밖:
return False
if 이미 방문했거나, 장애물이 있는 경우:
return False
return True
def push(x, y):
answer[x][y] = order
order += 1
visited[x][y] = True
que.append((x,y))
def bfs():
while que: # que에 요소가 존재한다면 반복
x, y = que.popleft() # que에서 요소 pop
for dx, dy in zip(dxs, dys):
nx, ny = x+dx, y+dy
if possible(nx, ny):
push(nx, ny)
push(시작 좌표) # que에 시작지점 삽입
bfs()
문제1
K번 최댓값으로 이동하기
(링크 : https://www.codetree.ai/missions/2/problems/move-to-max-k-times?&utm_source=clipboard&utm_medium=text)리뷰1
첫 번째 시도
True/False
대신 1 ~ k번
값을 저장했다.두 번째 시도
각 과정을 외부함수로 분리하지 않고, k번 반복하는 for문 내부에서 주석으로 각 과정을 기술하여 구분했다. 과정이 복잡한 경우 오히려 순차적으로 작성한 코드가 가독성이 높았다.
동일한 visited 배열을 사용하는 대신 for문에서 k번에 해당하는 새로운 visited 배열을 새로 생성하였다.
함수의 반환값이 동일한 자료형일 필요가 없음을 알게되었다. 가령 아래와 같은 코드가 가능했다.
def find_next_position(max_val):
global n, cnt
for i in range(n):
for j in range(n):
if visited[i][j] and grid[i][j] == max_val:
return i, j
return False
문제2
돌 잘 치우기
(링크 : https://www.codetree.ai/missions/2/problems/clear-stones-well?&utm_source=clipboard&utm_medium=text)리뷰
DFS
BFS
공통