๐Ÿ’ซ ETC/Problem Solving

[๊น€ํƒœ์› ์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‚ฌ๊ณผ๋‚˜๋ฌด (BFS)

ming412 2023. 11. 7. 16:22

โœ๏ธ ๋ฌธ์ œ ์š”์•ฝ

- ํ•ญ์ƒ ํ™€์ˆ˜์ธ N์— ๋Œ€ํ•ด, N * N ๊ฒฉ์žํŒ์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋‹ค์ด์•„๋ชฌ๋“œ ๋ชจ์–‘์˜ ๊ฒฉ์ž์˜ ํ•ฉ์„ ๊ตฌํ•˜์—ฌ๋ผ.

 

๐Ÿ’ช ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ (๋ฐ˜๋ณต๋ฌธ)

N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]

ans = 0
src, dst = N//2, N//2
for i in range(N//2 + 1):
    for j in range(src, dst+1):
        ans += board[i][j]
    src, dst = src-1, dst+1

src, dst = 1, N-2
for i in range(N//2 + 1, N):
    for j in range(src, dst+1):
        ans += board[i][j]
    src, dst = src+1, dst-1

print(ans)

 

โœจ ์šฐ์•„ํ•˜๊ฒŒ ํ’€๊ธฐ (BFS)

- BFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹ค์ด์•„๋ชฌ๋“œ ๋ชจ์–‘์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

    - ๋”ฐ๋ผ์„œ ํ(queue)์— ๊ฒฉ์žํŒ์˜ ์ค‘์‹ฌ์„ ๋‹ด๊ณ , BFS๋ฅผ ์ ์šฉํ•˜์—ฌ ๋‹ค์ด์•„๋ชฌ๋“œ ๋ชจ์–‘์œผ๋กœ ์ง„ํ–‰ํ•˜์ž! 

- BFS๋ฅผ ์–ธ์ œ๊นŒ์ง€ ์ ์šฉํ•ด์•ผํ• ๊นŒโ“

    - BFS์— ํ˜„์žฌ ๋ ˆ๋ฒจ(`L`)์„ ๋‹ด๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ ˆ๋ฒจ(`L+1`)์ด `N//2`๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ์—๋งŒ ํ์— ๋„ฃ๋Š”๋‹ค.

- ๋ฐฉ๋ฌธ(`visited`) ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘๊ณ , ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ์— ๋˜ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

- ๋‹ค์ด์•„๋ชฌ๋“œ ๋ชจ์–‘์˜ ๊ฒฉ์ž์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ `tot`์— ๋ˆ„์ ํ•ด์•ผ ํ•œ๋‹ค.

from collections import deque

N = int(input())
lst = [list(map(int, input().split())) for _ in range(N)]
visited = [[0] * N for _ in range(N)]

q = deque()
q.append((0, N//2, N//2)) # (๋ ˆ๋ฒจ, x์ขŒํ‘œ, y์ขŒํ‘œ)
visited[N//2][N//2] = 1 # ๋ฐฉ๋ฌธ
tot = lst[N//2][N//2] # ํ•ฉ

dx, dy = [0,-1,0,1], [1,0,-1,0]
while q:
    L, x, y = q.popleft()
    for w in range(4):
        LL, xx, yy = L+1, x+dx[w], y+dy[w]
        if LL > N // 2: continue # ๋ ˆ๋ฒจ์ด N//2๋ณด๋‹ค ํฌ๋ฉด stop
        if xx < 0 or xx >= N or yy < 0 or yy >= N: continue
        if visited[xx][yy] == 1: continue
        visited[xx][yy] = 1 # ๋ฐฉ๋ฌธ
        tot += lst[xx][yy] # ํ•ฉ
        q.append((LL, xx, yy))

print(tot)