본문 바로가기

알고리즘 삽질장

[인프런] 사과나무(BFS로 풀기)

반응형


문제설명

저번에 구현 유형으로 풀어본 사과나무 문제랑 동일하다. 하지만 BFS로 풀어야 한다.

https://techblog-history-younghunjo1.tistory.com/377

 

[인프런] 사과나무(다이아몬드)

문제설명 위 그림과 같이 N*N처럼 5*5로 사과나무가 존재할 때, 색깔로 칠해진 사과나무에 존재하는 사과들의 개수 합을 구하여라. 사과들의 개수는 한 칸 내에 있는 값을 의미한다. 사고과정 처

techblog-history-younghunjo1.tistory.com

사고과정

  • 문제에서 요구하는 영역을 어떻게 상태트리로 만들어야 할지 도저히 몰랐다. 그래서 강의를 보고 아이디어만 보고 어느정도 구현은 했는데, BFS하는 레벨을 도중에 중간에 멈추는 것을 어떤 방식으로 해야할지에서 또 막혔다..
  • 강의를 보았고 상태트리의 레벨 마다 그 때 레벨에서 큐의 길이만큼 BFS 탐색을 반복해서 수행하면 되었다.. 진짜 아이디어에 감탄했다..
  • 아직은 BFS로 상태트리를 만드는 게 어색하다..더 연습해야겠다..!

풀이(스스로 못 푼 풀이)

from collections import deque

n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
visited = [[0] * n for _ in range(n)]
# 초기 좌표
x = y = n//2
visited[x][y] = 1
queue = deque([(x, y)])
cnt = arr[x][y]
result = [(x, y)]
# 상,하,좌,우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 상태트리 레벨 정의
L = 0
while True:
    if L == n//2:
        break
    size = len(queue) 
    for _ in range(size):
        x, y = queue.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if visited[nx][ny] == 0:
                visited[nx][ny] = 1
                cnt += arr[nx][ny]
                queue.append((nx, ny))
    L += 1
print(cnt)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 미로탐색  (0) 2021.11.29
[인프런] 미로의 최단거리 통로  (0) 2021.11.29
[인프런] 송아지 찾기  (0) 2021.11.27
[인프런] 알파코드  (0) 2021.11.26
[인프런] 동전 분배하기  (0) 2021.11.26