๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

C++ for PS

BOJ 19538 ๋ฃจ๋จธ C++, java, python (BFS ํ‹€ ์žก๊ธฐ)

 

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

๋งŽ์ด ์–ด๋ ต์ง€ ์•Š์€ bfs ๋ฌธ์ œ์ด๋‹ค.

์ด ๋ฌธ์ œ๋กœ bfs ๋ฌธ์ œ์˜ ํ‹€์„ ์žก๋Š”๋ฐ ํฐ ๋„์›€์„ ๋ฐ›์•˜๋‹ค !

 

[๋ฌธ์ œ์™€ ์ž…์ถœ๋ ฅ]

๋ฃจ๋จธ๋Š” ์ตœ์ดˆ ์œ ํฌ์ž๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ์ตœ์ดˆ ์œ ํฌ์ž๋Š” ์—ฌ๋Ÿฌ ๋ช…์ผ ์ˆ˜ ์žˆ๊ณ , ์ตœ์ดˆ ์œ ํฌ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ  ์Šค์Šค๋กœ ๋ฃจ๋จธ๋ฅผ ๋งŒ๋“ค์–ด ๋ฏฟ๋Š” ์‚ฌ๋žŒ์€ ์—†๋‹ค. ๋งค๋ถ„ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋Š” ์‚ฌ๋žŒ์€ ๋ชจ๋“  ์ฃผ๋ณ€์ธ์—๊ฒŒ ๋ฃจ๋จธ๋ฅผ ๋™์‹œ์— ํผํŠธ๋ฆฌ๋ฉฐ, ๊ตฐ์ค‘ ์† ์‚ฌ๋žŒ์€ ์ฃผ๋ณ€์ธ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์„ ๋•Œ ๋ณธ์ธ๋„ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋Š”๋‹ค. ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ง์€ ๋“ฃ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋ฒˆ ๋ฏฟ์€ ๋ฃจ๋จธ๋Š” ๊ณ„์† ๋ฏฟ๋Š”๋‹ค. ์ด๋•Œ, ์‚ฌ๋žŒ๋“ค์ด ๋ฃจ๋จธ๋ฅผ ์ฒ˜์Œ ๋ฏฟ๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด ๋ณด์ž.

 

 

์ž…๋ ฅ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด

7๋ช…์˜ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค. (1 ≤ ์‚ฌ๋žŒ ์ˆ˜ ≤ 200 000)

7๊ฐœ ์ค„์— ๊ฑธ์ณ ๊ฐ ๋ฒˆํ˜ธ์˜ ์‚ฌ๋žŒ๊ณผ ์—ฐ๊ฒฐ๋œ ์‚ฌ๋žŒ์„ ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ

๊ฐ ์ค„์—์„œ์˜ 0์€ ์ž…๋ ฅ์˜ ๋์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

๊ทธ ์ดํ›„์— ์ตœ์ดˆ ์œ ํฌ์ž ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ ์ตœ์ดˆ ์œ ํฌ์ž ์ˆ˜ ≤ ์ „์ฒด ์‚ฌ๋žŒ ์ˆ˜)

2๋ช…์˜ ์ตœ์ดˆ ์œ ํฌ์ž๊ฐ€ ์žˆ๋Š”๋ฐ

1๋ฒˆ๊ณผ 6๋ฒˆ์ด๋‹ค.

 

 

 

7๋ช…์ด ๊ฐ์—ผ๋œ ์‹œ๊ฐ„์„ ํ•œ ์ค„์—์„œ ๊ณต๋ฐฑ ๋‹จ์œ„๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์ตœ์ดˆ ์œ ํฌ์ž๋Š” 0๋ถ„์œผ๋กœ, ๊ฐ์—ผ๋˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์€ -1๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…: BFS]

BFS๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(Breadth-First Search)์€ ๋ฃจํŠธ ๋…ธ๋“œ(ํ˜น์€ ๋‹ค๋ฅธ ์ž„์˜์˜ ๋…ธ๋“œ)์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์‹œ์ž‘ ์ •์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ์ •์ ์„ ๋‚˜์ค‘์— ๋ฐฉ๋ฌธํ•œ๋‹ค.

๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ํ˜น์€ ์ž„์˜์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•œ๋‹ค.

 

BFS๋Š” ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ์ €์žฅํ•œ ํ›„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰, ์„ ์ž…์„ ์ถœ(FIFO) ์›์น™์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.


[๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ• ์„ค๋ช…]

bfs ๋ฌธ์ œ์˜ ์ „ํ˜•์ ์ธ ํ‹€

์˜ˆ์ œ 1๋ฒˆ์˜ ์ƒํ™ฉ์„ ์ด์–ด์„œ ์ƒ๊ฐํ•ด๋ณด๋ ค ํ•œ๋‹ค.

ํ์—๋Š” ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์žฅ ์ฒ˜์Œ์—๋Š” ์ตœ์ดˆ ๊ฐ์—ผ์ž์˜ ๋ฒˆํ˜ธ 1๊ณผ 6์„ ํ์— ๋„ฃ๋Š”๋‹ค.

ํ์—์„œ ํ•œ ์‚ฌ๋žŒ(1๋ฒˆ)์„ ๋บ€๋‹ค. ์ด ์‚ฌ๋žŒ์€ ์ตœ์ดˆ ๊ฐ์—ผ์ž์ด๋ฏ€๋กœ 0๋ถ„์— ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์ด๋‹ค. ์ด ์‚ฌ๋žŒ์€ ์ฃผ๋ณ€์ธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ชจ๋“  ์ฃผ๋ณ€์ธ๋“ค(2๋ฒˆ๊ณผ 3๋ฒˆ)์„ ์‚ดํŽด๋ณด์ž!

 

2๋ฒˆ๊ณผ 3๋ฒˆ ๊ฐ๊ฐ์˜ ์ฃผ๋ณ€์ธ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๊ฐ์—ผ๋˜์—ˆ๋Š”์ง€ ํŒ๋ณ„ํ•œ ๋’ค (ํŒ๋ณ„์€ ์กฐ๊ธˆ ๋’ค์—์„œ ์„ค๋ช…ํ•œ๋‹ค)

์ƒˆ๋กœ ๊ฐ์—ผ๋˜์—ˆ๋‹ค๋ฉด

ํ์— ๊ฐ์—ผ๋œ ์ฃผ๋ณ€์ธ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ๊ณ 

(2๋ฒˆ์ด ๊ฐ์—ผ๋˜์—ˆ์œผ๋ฏ€๋กœ 2๋Š” ํ์— ์ถ”๊ฐ€ํ•˜์ง€๋งŒ 3๋ฒˆ์€ ๊ฐ์—ผ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค)

ํ์—์„œ ๋‚˜์˜จ ์‚ฌ๋žŒ(1)์˜ ๊ฐ์—ผ ์‹œ๊ฐ„(0๋ถ„) + 1๋ถ„์„ ํ•ด์„œ ์ •๋‹ต ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ์— ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ด์–ด์„œ ๋“ค์–ด๊ฐ„๋‹ค.

 

๋‹ค์‹œ ํ์—์„œ ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋นผ๋‚ด์–ด ์ฃผ๋ณ€์ธ์—๊ฒŒ ๋ผ์น˜๋Š” ์˜ํ–ฅ์„ ํƒ์ƒ‰ํ•œ๋‹ค.

์•„์ง ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š” ์ตœ์ดˆ ๋ฐœ๊ฒฌ์ž(6๋ฒˆ)๊ฐ€ ์ฃผ๋ณ€์ธ์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ํƒ์ƒ‰ํ•˜๊ณ 

1๋ถ„์— ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ(2๋ฒˆ),

์ด๋ ‡๊ฒŒ ์ด์–ด์„œ ํƒ์ƒ‰์„ ํ•œ๋‹ค.

 

ํƒ์ƒ‰์„ ํ•˜๋‹ค๊ฐ€ ํ๊ฐ€ ๋นˆ๋‹ค๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ์ƒˆ๋กœ์šด ์˜ํ–ฅ์„ ๋ผ์น  ์‚ฌ๋žŒ์ด ์—†์„๋งŒํผ ๊ฐ์—ผ์ด ์ถฉ๋ถ„ํžˆ ์ด๋ฃจ์–ด์กŒ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ •๋‹ต ๋ฐฐ์—ด answer์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋์ด๋‹ค.

 


ํƒ์ƒ‰ ๋ฐฉ๋ฒ•

์ด ๋ฌธ์ œ๋Š” “๊ณผ์—ฐ ์ฃผ๋ณ€์ธ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๊ฐ์—ผ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํŒ๋ณ„ํ•  ๊ฒƒ์ธ๊ฐ€?” ๊ฐ€ ๊ด€๊ฑด์ด๋‹ค.

 

1. ๋ช‡ ๋ช… ์ด์ƒ ๊ฐ์—ผ๋˜์–ด์•ผ i๋ฒˆ ์‚ฌ๋žŒ์ด ๊ฐ์—ผ๋˜๋Š”์ง€๋ฅผ ๊ตฌํ•ด turn[i]์— ์ €์žฅํ•œ๋‹ค.

 

์ฃผ๋ณ€์ธ์ด 4๋ช…์ธ ๊ฒฝ์šฐ, ์ ˆ๋ฐ˜ ์ด์ƒ์ธ 2๋ช… ์ด์ƒ์ด ๊ฐ์—ผ๋˜์–ด์•ผ ๋‚ด๊ฐ€ ๊ฐ์—ผ๋œ๋‹ค.

์ฃผ๋ณ€์ธ์ด 3๋ช…์ธ ๊ฒฝ์šฐ, ์ ˆ๋ฐ˜ ์ด์ƒ์ธ 2๋ช… ์ด์ƒ์ด ๊ฐ์—ผ๋˜์–ด์•ผ ๋‚ด๊ฐ€ ๊ฐ์—ผ๋œ๋‹ค.

 

๋ช‡ ๋ช… ์ด์ƒ ๊ฐ์—ผ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ˆ˜๋Š” (์ฃผ๋ณ€์ธ ์ˆ˜ + 1) / 2 ์—ฐ์‚ฐ์˜ ๋ชซ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. bfs๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ(ํ์—์„œ ๋‚˜์˜จ ์‚ฌ๋žŒ)์˜ ์ฃผ๋ณ€์ธ์˜ ๊ฐ์—ผ๊นŒ์ง€ ๋‚จ์€ ์ฃผ๋ณ€์ธ ์ˆ˜ (=turn[i])๋ฅผ 1์”ฉ ๋นผ์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด turn[i]์˜ ๊ฐ’์ด 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ 0๋ณด๋‹ค ์ž‘์„ ๋•Œ, ๊ฐ์—ผ๋˜์—ˆ์Œ์„ ์‰ฝ๊ฒŒ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฏธ ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์„ ์ƒˆ๋กญ๊ฒŒ ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ๋˜ ํƒ์ƒ‰ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. = ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ํ์— ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž!

๋งจ ๋จผ์ € 1๋ฒˆ์ด ๊ฐ์—ผ๋˜์—ˆ์„ ๋•Œ 2๋ฒˆ์€ ๊ฐ์—ผ๋˜์ง€๋งŒ 3๋ฒˆ์€ ์ฃผ๋ณ€์ธ์ด ๋งŽ์•„์„œ ๊ฐ์—ผ๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋˜๋‹ค์‹œ ์ด๋ฏธ ๊ฐ์—ผ๋œ 1๋ฒˆ์„ ์ค‘๋ณตํ•ด์„œ ํƒ์ƒ‰ํ•˜๋ฉด 3๋ฒˆ์€ ์ด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ณ  2๋ช…์ด ๊ฐ์—ผ๋˜์—ˆ๋‹ค๊ณ  ์ธ์‹ ํ•ด ๊ฐ์—ผ์ž ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด answer ๋ฐฐ์—ด์„ ๋งจ ์ฒ˜์Œ์— -1๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋‘๊ณ ,

answer[i]๊ฐ€ -1์ด๊ณ  turn[i]์ด 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ 0๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์— “์ƒˆ๋กœ” ๊ฐ์—ผ๋จ์„ ํŒ๋ณ„ํ•˜๊ณ  ํ์— ๋„ฃ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

[C++ ์†Œ์Šค์ฝ”๋“œ]

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

vector<int> solution(int N, vector<vector<int>> E, int M, vector<int> firstInfected) {
    queue<int> Q; // ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.
    vector<int> answer(N + 1, -1); // solution ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ•  ๋ฐฐ์—ด, ์‚ฌ์ด์ฆˆ N+1, -1๋กœ ์ดˆ๊ธฐํ™”
    vector<int> turn(N + 1, 0); // ๊ฐ์—ผ๊นŒ์ง€ ๋‚จ์€ ์ฃผ๋ณ€ ๋น„๊ฐ์—ผ ์‚ฌ๋žŒ ์ˆ˜, ์‚ฌ์ด์ฆˆ N+1, 0๋กœ ์ดˆ๊ธฐํ™”

    // ์ตœ์กฐ์ƒ์„ฑ์ž ์ฒ˜๋ฆฌ
    for (int t : firstInfected) {
        Q.push(t); // ์ตœ์กฐ์ƒ์„ฑ์ž๋Š” ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์ด๊ณ  ์ฃผ๋ณ€์ธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ํ์— ๋„ฃ์–ด์ฃผ๊ณ 
        answer[t] = 0; // 0๋ถ„์— ๊ฐ์—ผ๋˜์—ˆ์Œ์„ ์ €์žฅํ•œ๋‹ค.
    }

    // ์ฃผ๋ณ€์ธ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์„ ๋•Œ ๋ณธ์ธ๋„ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์œผ๋ฏ€๋กœ
    // ๋ช‡ ๋ช…์ด ๊ฐ์—ผ๋˜์—ˆ์„ ๋•Œ ์ž์‹ ์ด ๊ฐ์—ผ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ
    // ์‚ฌ๋žŒ i์˜ ์ฃผ๋ณ€์ธ๋ฌผ ์ˆ˜ + 1 / 2์˜ ๋ชซ์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค.
    // ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์˜ ๋์„ ๋งํ•˜๋Š” 0์ด adj ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ + 1์€ ์•ˆํ•ด๋„ ๋œ๋‹ค.
    for (int i = 1; i <= N; i++)
        turn[i] = E[i].size() / 2;

    while (!Q.empty()) { // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด ๋ชจ๋“  ํƒ์ƒ‰์„ ๋งˆ์ณค๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
        int current = Q.front(); // ํ˜„์žฌ, ๊ฐ€์žฅ ๋จผ์ € ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜
        Q.pop();

        for (int next : E[current]) { // ์ฃผ๋ณ€์ธ๋ฌผ๋“ค์—๊ฒŒ
            if (next == 0) break;
            turn[next] -= 1; // ์ž์‹ (์ฃผ๋ณ€์ธ๋ฌผ)์ด ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‚ฌ๋žŒ ์ˆ˜๋ฅผ 1 ๋นผ๊ณ 
            if (answer[next] == -1 && turn[next] <= 0) { // ๋งŒ์•ฝ ์•„์ง ๊ฐ์—ผ๋˜์ง€ ์•Š์•˜๊ณ  ์ฃผ๋ณ€์ธ์˜ ๋ฐ˜ ์ด์ƒ์ด ๊ฐ์—ผ๋˜์—ˆ๋‹ค๋ฉด
                Q.push(next); // ๊ฐ์—ผ๋˜์—ˆ๊ธฐ์— ํ์— ์ž์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 
                answer[next] = answer[current] + 1; // ์ž์‹ ์„ ๊ฐ์—ผ์‹œํ‚จ ๋งˆ์ง€๋ง‰ ์ฃผ๋ณ€์ธ์˜ ๊ฐ์—ผ๋œ ์‹œ๊ฐ„ + 1๋ถ„์„ ๋”ํ•ด ์ €์žฅํ•œ๋‹ค.
            }
        }
    }

    // ๊ณ„์‚ฐ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฐฐ์—ด์— 0๋ฒˆ index๊ฐ€ ์•„๋‹Œ 1๋ฒˆ index๋ถ€ํ„ฐ ์ •๋‹ต์ด ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ,
    // ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ง€์šฐ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    answer.erase(answer.begin());
    return answer;
}

int main() {
    int N;
    cin >> N;
    vector<vector<int>> E(N + 1);
    for (int i = 1; i <= N; i++) {
        while (1) {
            int t;
            cin >> t;
            E[i].push_back(t);
            if (t == 0) break;
        }
    }

    int M;
    cin >> M;
    vector<int> firstInfected(M);
    for (int i = 0; i < M; i++) {
        int t;
        cin >> t;
        firstInfected.push_back(t);
    }

    vector<int> ans = solution(N, E, M, firstInfected);
    for (int i = 0; i < N; i++)
        cout << ans[i] << " ";
    cout << "\n";
}

[Python ์†Œ์Šค์ฝ”๋“œ]

import sys
from collections import deque


def solution(N, E, M, firstInfected):
    Q = deque([]) # ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.
    answer = [-1] * (N+1) # solution ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ•  ๋ฐฐ์—ด, ์‚ฌ์ด์ฆˆ N+1, -1๋กœ ์ดˆ๊ธฐํ™”
    turn = [0] * (N+1) # ๊ฐ์—ผ๊นŒ์ง€ ๋‚จ์€ ์ฃผ๋ณ€ ๋น„๊ฐ์—ผ ์‚ฌ๋žŒ ์ˆ˜, ์‚ฌ์ด์ฆˆ N+1, 0๋กœ ์ดˆ๊ธฐํ™”

    # ์ตœ์กฐ์ƒ์„ฑ์ž ์ฒ˜๋ฆฌ
    for t in firstInfected:
        Q.append(t) # ์ตœ์กฐ์ƒ์„ฑ์ž๋Š” ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์ด๊ณ  ์ฃผ๋ณ€์ธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ํ์— ๋„ฃ์–ด์ฃผ๊ณ 
        answer[t] = 0 # 0๋ถ„์— ๊ฐ์—ผ๋˜์—ˆ์Œ์„ ์ €์žฅํ•œ๋‹ค.

    # ์ฃผ๋ณ€์ธ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์„ ๋•Œ ๋ณธ์ธ๋„ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์œผ๋ฏ€๋กœ
    # ๋ช‡ ๋ช…์ด ๊ฐ์—ผ๋˜์—ˆ์„ ๋•Œ ์ž์‹ ์ด ๊ฐ์—ผ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ
    # ์‚ฌ๋žŒ i์˜ ์ฃผ๋ณ€์ธ๋ฌผ ์ˆ˜ + 1 / 2์˜ ๋ชซ์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค.
    # ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์˜ ๋์„ ๋งํ•˜๋Š” 0์ด adj ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ + 1์€ ์•ˆํ•ด๋„ ๋œ๋‹ค.
    for i in range(1, N+1):
        turn[i] = (len(E[i])) // 2

    while Q: # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด ๋ชจ๋“  ํƒ์ƒ‰์„ ๋งˆ์ณค๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
        current = Q.popleft() # ํ˜„์žฌ, ๊ฐ€์žฅ ๋จผ์ € ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜
        for next in E[current]: # ์ฃผ๋ณ€์ธ๋ฌผ๋“ค์—๊ฒŒ
            if next == 0:
                break
            turn[next] -= 1 # ์ž์‹ (์ฃผ๋ณ€์ธ๋ฌผ)์ด ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‚ฌ๋žŒ ์ˆ˜๋ฅผ 1 ๋นผ๊ณ 
            if answer[next] == -1 and turn[next] <= 0: # ๋งŒ์•ฝ ์•„์ง ๊ฐ์—ผ๋˜์ง€ ์•Š์•˜๊ณ  ์ฃผ๋ณ€์ธ์˜ ๋ฐ˜ ์ด์ƒ์ด ๊ฐ์—ผ๋˜์—ˆ๋‹ค๋ฉด
                Q.append(next) # ๊ฐ์—ผ๋˜์—ˆ๊ธฐ์— ํ์— ์ž์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 
                answer[next] = answer[current] + 1 # ์ž์‹ ์„ ๊ฐ์—ผ์‹œํ‚จ ๋งˆ์ง€๋ง‰ ์ฃผ๋ณ€์ธ์˜ ๊ฐ์—ผ๋œ ์‹œ๊ฐ„ + 1๋ถ„์„ ๋”ํ•ด ์ €์žฅํ•œ๋‹ค.
    
    # ๊ณ„์‚ฐ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฐฐ์—ด์— 0๋ฒˆ index๊ฐ€ ์•„๋‹Œ 1๋ฒˆ index๋ถ€ํ„ฐ ์ •๋‹ต์ด ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ,
    # ๋ฐฐ์—ด์˜ ๋‘๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    return answer[1:] 


input = sys.stdin.readline
N = int(input())
E = [[] for _ in range(N+1)]
for i in range(1, N+1):
    E[i] = list(map(int, input().split()))

M = int(input())
firstInfected = list(map(int, input().split()))
print(" ".join(map(str, solution(N, E, M, firstInfected))))

[JAVA ์†Œ์Šค์ฝ”๋“œ]

import java.io.*;
import java.util.*;

public class Main {

	public static int[] solution(int N, int[][] adj, int M, int[] firstInfected) {
		Queue<Integer> Q = new ArrayDeque<>(); // ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.
		int[] answer = new int[N + 1]; // solution ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ•  ๋ฐฐ์—ด
		Arrays.fill(answer, -1); // ์‚ฌ์ด์ฆˆ N+1, -1๋กœ ์ดˆ๊ธฐํ™”
		int[] turn = new int[N + 1]; // ๊ฐ์—ผ๊นŒ์ง€ ๋‚จ์€ ์ฃผ๋ณ€ ๋น„๊ฐ์—ผ ์‚ฌ๋žŒ ์ˆ˜
		Arrays.fill(turn, 0); // ์‚ฌ์ด์ฆˆ N+1, 0๋กœ ์ดˆ๊ธฐํ™”

		// ์ตœ์กฐ์ƒ์„ฑ์ž ์ฒ˜๋ฆฌ
		for (int t : firstInfected) {
			Q.add(t); // ์ตœ์กฐ์ƒ์„ฑ์ž๋Š” ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์ด๊ณ  ์ฃผ๋ณ€์ธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ํ์— ๋„ฃ์–ด์ฃผ๊ณ 
			answer[t] = 0; // 0๋ถ„์— ๊ฐ์—ผ๋˜์—ˆ์Œ์„ ์ €์žฅํ•œ๋‹ค.
		}

		// ์ฃผ๋ณ€์ธ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์„ ๋•Œ ๋ณธ์ธ๋„ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์œผ๋ฏ€๋กœ
		// ๋ช‡ ๋ช…์ด ๊ฐ์—ผ๋˜์—ˆ์„ ๋•Œ ์ž์‹ ์ด ๊ฐ์—ผ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ
		// ์‚ฌ๋žŒ i์˜ ์ฃผ๋ณ€์ธ๋ฌผ ์ˆ˜ + 1 / 2์˜ ๋ชซ์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค.
		// ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์˜ ๋์„ ๋งํ•˜๋Š” 0์ด adj ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ + 1์€ ์•ˆํ•ด๋„ ๋œ๋‹ค.
		for (int i = 1; i <= N; i++)
			turn[i] = adj[i].length / 2;

		while (!Q.isEmpty()) { // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด ๋ชจ๋“  ํƒ์ƒ‰์„ ๋งˆ์ณค๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
			int current = Q.poll(); // ํ˜„์žฌ, ๊ฐ€์žฅ ๋จผ์ € ๊ฐ์—ผ๋œ ์‚ฌ๋žŒ์˜ 

			for (Integer next : adj[current]) { // ์ฃผ๋ณ€์ธ๋ฌผ๋“ค์—๊ฒŒ
				if (next == 0) break;
				turn[next] -= 1; // ์ž์‹ (์ฃผ๋ณ€์ธ๋ฌผ)์ด ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‚ฌ๋žŒ ์ˆ˜๋ฅผ 1 ๋นผ๊ณ 
				if (answer[next] == -1 && turn[next] <= 0) { // ๋งŒ์•ฝ ์•„์ง ๊ฐ์—ผ๋˜์ง€ ์•Š์•˜๊ณ  ์ฃผ๋ณ€์ธ์˜ ๋ฐ˜ ์ด์ƒ์ด ๊ฐ์—ผ๋˜์—ˆ๋‹ค๋ฉด
					Q.add(next); // ๊ฐ์—ผ๋˜์—ˆ๊ธฐ์— ํ์— ์ž์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 
					answer[next] = answer[current] + 1; // ์ž์‹ ์„ ๊ฐ์—ผ์‹œํ‚จ ๋งˆ์ง€๋ง‰ ์ฃผ๋ณ€์ธ์˜ ๊ฐ์—ผ๋œ ์‹œ๊ฐ„ + 1๋ถ„์„ ๋”ํ•ด ์ €์žฅํ•œ๋‹ค.
				}
			}
		}

		// ๊ณ„์‚ฐ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฐฐ์—ด์— 0๋ฒˆ index๊ฐ€ ์•„๋‹Œ 1๋ฒˆ index๋ถ€ํ„ฐ ์ •๋‹ต์ด ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ,
		// ๋ฐฐ์—ด์„ ๋‘๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ž˜๋ผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
		return Arrays.copyOfRange(answer, 1, answer.length);
	}
	
    
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());
		int[][] adj = new int[N+1][];
		adj[0] = new int[]{0};
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine());
			List<Integer> arrayList = new ArrayList<>();
			while (true) {
				int temp = Integer.parseInt(st.nextToken());
				arrayList.add(temp);
				if (temp == 0) {
					adj[i] = arrayList.stream().mapToInt(Integer::intValue).toArray();
					break;
				}
			}
		}

		int M = Integer.parseInt(br.readLine());
		int[] firstInfected = new int[M];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < M; i++) {
			int temp = Integer.parseInt(st.nextToken());
			firstInfected[i] = temp;
		}
		Arrays.stream(solution(N, adj, M, firstInfected)).forEach(t -> sb.append(t).append(" "));
		System.out.println(sb);
	}
}