TIL

[TIL] 99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 5์ผ์ฐจ TIL - BFS : <๋ฐฑ์ค€ 24444 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1> ๋ฌธ์ œํ’€์ด with python

๋ฐ์ดby๋ฐ์ด 2024. 11. 1. 16:35

Today's keyword : BFS

 

๐Ÿ“Œ ๊ฐœ๋… ์„ค๋ช…

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) 

  • BFS๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ์‹œ์ž‘ ์ •์ ์—์„œ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ ํ›„, ๊ทธ ์ •์ ์˜ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ฆ‰, "๋„ˆ๋น„"๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • BFS๋Š” ํ(Queue) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ํ๋Š” FIFO(First In First Out) ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ, ๋จผ์ € ๋“ค์–ด์˜จ ์ •์ ์ด ๋จผ์ € ๋‚˜๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

https://www.acmicpc.net/problem/24444

์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์—์„œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฐ ์ •์ ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ž…๋ ฅ

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ •์ ์˜ ์ˆ˜ n, ๊ฐ„์„ ์˜ ์ˆ˜ m, ์‹œ์ž‘ ์ •์  r์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋‹ค์Œ m๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ„์„  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์€ ๋‘ ์ •์  a์™€ b๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” a์™€ b๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ

  • ๊ฐ ์ •์ ์— ๋Œ€ํ•ด ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์€ 0์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ๋ฌธ์ œ ํ’€์ด

import sys
from collections import deque

input = sys.stdin.readline
n, m, r = map(int, input().split())
graph = [[] for i in range(n + 1)]

# m๊ฐœ์˜ ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)  # a์—์„œ b๋กœ์˜ ๊ฐ„์„  ์ถ”๊ฐ€
    graph[b].append(a)  # b์—์„œ a๋กœ์˜ ๊ฐ„์„  ์ถ”๊ฐ€ (์–‘๋ฐฉํ–ฅ)

# ๊ฐ ์ •์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
for i in range(1, n + 1):
    graph[i].sort()

visited = [0] * (n + 1)
queue = deque()
visit_order = 1

def bfs(graph, v, visited):
    global visit_order
    queue.append(v)

    while queue:
        i = queue.popleft()
        if visited[i] == 0:
            visited[i] = visit_order
            visit_order += 1
            for j in graph[i]:
                if visited[j] == 0:  # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ๋งŒ ์ถ”๊ฐ€
                    queue.append(j)

bfs(graph, r, visited)

for i in range(1, n + 1):
    print(visited[i])

1. ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”:

  • ์ •์  ์ˆ˜ n, ๊ฐ„์„  ์ˆ˜ m, ์‹œ์ž‘ ์ •์  r์„ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด graph ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ:

  • m๊ฐœ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ๊ฐ„์„ ์ด๋ฏ€๋กœ ๋‘ ์ •์  ๋ชจ๋‘์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

3. ์ •์  ์ •๋ ฌ

  • ๊ฐ ์ •์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ, BFS ํƒ์ƒ‰ ์‹œ ์ •์ ์ด ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

4. BFS ๊ตฌํ˜„:

  • BFS๋ฅผ ์ˆ˜ํ–‰ํ•  bfs ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๊ณ , ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค visited ๋ฆฌ์ŠคํŠธ์— ํ˜„์žฌ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

5. BFS ํ˜ธ์ถœ ๋ฐ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

  • ์‹œ์ž‘ ์ •์  r์—์„œ BFS๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฐ ์ •์ ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ์ฃผ์˜์‚ฌํ•ญ

1. Deque ์‚ฌ์šฉ

  ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ค๋ฅธ์ชฝ์— ์‚ฝ์ž…(append)ํ•˜๊ณ  ์™ผ์ชฝ์—์„œ ์ถ”์ถœ(popleft)ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—  ์•ž๊ณผ ๋’ค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ์ž๋ฃŒํ˜•์ธ deque๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. deque๋Š” collections ํŒจํ‚ค์ง€์˜ deque ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from collections import deque

2. ๋ฐฉ๋ฌธํ•œ ์ •์ ์€ ํ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ 

 ์ •์ ์„ ํ์— ์‚ฝ์ž…ํ•  ๋•Œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ๋งŒ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•ด์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

            for j in graph[i]:
                if visited[j] == 0:  # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ๋งŒ ์ถ”๊ฐ€ํ•˜๋„๋ก ์กฐ๊ฑด ์„ค์ •
                    queue.append(j)

์ฒ˜์Œ์— ํ•ด๋‹น ์กฐ๊ฑด ์—†์ด ์ถ”๊ฐ€ํ•ด์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ๋˜ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์“ธ๋ฐ์—†์ด ์—ฐ์‚ฐ ๊ณผ์ •์ด ๊ธธ์–ด์กŒ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


deque([1])
1 [0, 1, 0, 0, 0, 0]
deque([2, 4])
2 [0, 1, 2, 0, 0, 0]
deque([4, 1, 3, 4])
4 [0, 1, 2, 0, 3, 0]
deque([1, 3, 4, 1, 2, 3])
deque([3, 4, 1, 2, 3])
3 [0, 1, 2, 4, 3, 0]
deque([4, 1, 2, 3, 2, 4])
deque([1, 2, 3, 2, 4])
deque([2, 3, 2, 4])
deque([3, 2, 4])
deque([2, 4])
deque([4])

3. sys.stdin.readline ์‚ฌ์šฉ 

input()์œผ๋กœ๋งŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— input = sys.stdin.readline ์„ ํ†ตํ•ด ์ž…๋ ฅ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. input() ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ๋Š” ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, sys.stdin.readline์€ ํ•œ ๋ฒˆ์— ์ „์ฒด ์ค„์„ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. 

 

 

 

์˜ค๋Š˜์˜ ํšŒ๊ณ  

  • ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ

 

 

 

#99ํด๋Ÿฝ #์ฝ”๋”ฉํ…Œ์ŠคํŠธ์ค€๋น„ #๊ฐœ๋ฐœ์ž์ทจ์—… #ํ•ญํ•ด99 #TIL

๋Œ“๊ธ€์ˆ˜0