๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/18352)
<ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ>
๋ฌธ์
์ด๋ค ๋๋ผ์๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ๋์์ M๊ฐ์ ๋จ๋ฐฉํฅ ๋๋ก๊ฐ ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ก์ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด๋ ํน์ ํ ๋์ X๋ก๋ถํฐ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ K์ธ ๋ชจ๋ ๋์๋ค์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ํ ์ถ๋ฐ ๋์ X์์ ์ถ๋ฐ ๋์ X๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
์๋ฅผ ๋ค์ด N=4, K=2, X=1์ผ ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ํ๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์.
์ด๋ 1๋ฒ ๋์์์ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ 2์ธ ๋์๋ 4๋ฒ ๋์๋ฟ์ด๋ค. 2๋ฒ๊ณผ 3๋ฒ ๋์์ ๊ฒฝ์ฐ, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅํ์ง ์๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ์ ์์ฐ์ A, B๊ฐ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ๋์์์ B๋ฒ ๋์๋ก ์ด๋ํ๋ ๋จ๋ฐฉํฅ ๋๋ก๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ๋ค. (1 ≤ A, B ≤ N) ๋จ, A์ B๋ ์๋ก ๋ค๋ฅธ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
X๋ก๋ถํฐ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋ชจ๋ ๋์์ ๋ฒํธ๋ฅผ ํ ์ค์ ํ๋์ฉ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค. ์ด๋ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์๊ฐ ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- ์ด๊ธฐ ์ฝ๋: ์๊ฐ ์ด๊ณผ
import sys
def bfs(graph, start, depth):
visited=[start]
queue=[start]
while queue:
temp=queue.pop(0)
for i in graph[temp]:
if i not in visited:
visited.append(i)
depth[i]=depth[temp]+1
queue.append(i)
if __name__=='__main__':
#๋์์ ๊ฐ์, ๋๋ก์ ๊ฐ์, ๊ฑฐ๋ฆฌ ์ ๋ณด, ์ถ๋ฐ ๋์์ ๋ฒํธ
N,M,K,X=map(int,sys.stdin.readline().split())
graph={}
depth={}
for i in range(N):
graph[i+1]=[]
depth[i+1]=0
for i in range(M):
A,B=map(int,sys.stdin.readline().split())
graph[A].append(B)
bfs(graph,X,depth)
result=[]
for key,value in depth.items():
if value==K:
result.append(key)
if len(result)==0:
print(-1)
else:
result.sort()
for i in result:
print(i)
์ฒซ ๋์ ... ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ๋๋ ์๊ฐ๋์ง ์์ ์ ์ ๋ด๋ฒ๋ ค ๋๊ณ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํ์์๋ค. ๊ทธ ๋ฌธ์ ๋ฅผ ํตํด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ ์ฌ๋ผ ๋ค์ ๋์ -!
โ ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋๊ฐ?
depth๋ก ์ถฉ๋ถํ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์์๋ visited ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ์๋ค. ์ฌ๊ธฐ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ๋ค.
์์ ๋ฌธ์ ์ ์ ์ฝ์น ์ฝ๋์ด๋ค.
- ๋ ๋ฒ์งธ ์ฝ๋: ์๊ฐ ์ด๊ณผ
import sys
def bfs(graph, start, depth):
queue=[start]
while queue:
temp=queue.pop(0)
for i in graph[temp]:
if depth[i]==0 and i!=start:
depth[i]=depth[temp]+1
queue.append(i)
if __name__=='__main__':
#๋์์ ๊ฐ์, ๋๋ก์ ๊ฐ์, ๊ฑฐ๋ฆฌ ์ ๋ณด, ์ถ๋ฐ ๋์์ ๋ฒํธ
N,M,K,X=map(int,sys.stdin.readline().split())
graph={}
depth={}
for i in range(N):
graph[i+1]=[]
depth[i+1]=0
for i in range(M):
A,B=map(int,sys.stdin.readline().split())
graph[A].append(B)
bfs(graph,X,depth)
result=[]
for key,value in depth.items():
if value==K:
result.append(key)
if len(result)==0:
print(-1)
else:
result.sort()
for i in result:
print(i)
๋ด๊ฐ ์๊ฐํ ๋ฌธ์ ์ ์ ๊ณ ์ณค์์๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
โ ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋๊ฐ?
์ด๋ฒ์๋ ์ด์ ๋ฅผ ์ฐพ์ง ๋ชปํด ๊ฒ์์ ํ์ ๋น๋ ธ๋ค. ์ฐพ์๋ณธ ๊ฒฐ๊ณผ list๋ฅผ deque๋ก ์ฌ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
- my solution
import sys
from collections import deque
def bfs(graph, start, depth):
queue=deque([start])
while queue:
temp=queue.popleft()
for i in graph[temp]:
if depth[i]==0 and i!=start: #์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด
depth[i]=depth[temp]+1
queue.append(i)
if __name__=='__main__':
#๋์์ ๊ฐ์, ๋๋ก์ ๊ฐ์, ๊ฑฐ๋ฆฌ ์ ๋ณด, ์ถ๋ฐ ๋์์ ๋ฒํธ
N,M,K,X=map(int,sys.stdin.readline().split())
graph={}
depth={}
for i in range(N):
graph[i+1]=[]
depth[i+1]=0
for i in range(M):
A,B=map(int,sys.stdin.readline().split())
graph[A].append(B)
bfs(graph,X,depth)
result=[]
for i in range(N):
if depth[i+1]==K: # ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K
result.append(i+1)
if len(result)==0: # ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด
print(-1)
else: # ๋์์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅ
result.sort()
for i in result:
print(i)
- bfs
- queue: deque๋ก ์ ์ธ
- queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต: ์ ค ์ฒ์ ๊ฐ pop ํด์ ๊ทธ์ ์ฐ๊ฒฐ๋ ์ด์ ๋์์ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๊ฑฐ๋ฆฌ(ํ์ฌ ๋์ depth์ +1) ์ ์ฅ ๋ฐ queue์ ์ถ๊ฐ - main
- ์ ๋ ฅ
- graph: dict, ๋์ ์ฐ๊ฒฐ ๊ทธ๋ํ
- depth: dict, ๊ฑฐ๋ฆฌ ์ ๋ณด ์ ์ฅ
- ๋ฐฉํฅ ์๋ ๊ทธ๋ํ
- bfs ํธ์ถ
- depth ์ํ๋ฅผ ํตํด ์ต๋จ ๊ฑฐ๋ฆฌ K์ ๊ฐ์ ๋์๊ฐ ์๋ค๋ฉด result์ ์ถ๊ฐ -> ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด -1 ์ถ๋ ฅ/ ์กด์ฌํ๋ฉด ๋์์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅ
์๊ฐ๐ค
์๊ฐ ์ด๊ณผ์์ ๋ฒ์ด๋์ง ๋ชปํ ์ค ์์์ง๋ง... deque๋ฅผ ํตํด ํ์ถ ์๋ฃ -!
๊ธฐ์ตํ์ deque -!
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 11051_์ดํญ ๊ณ์ 2 (0) | 2022.02.21 |
---|---|
[Baekjoon] 4358_์ํํ (0) | 2022.02.16 |
[Baekjoon] 11724_์ฐ๊ฒฐ ์์์ ๊ฐ์ (0) | 2022.01.26 |
[Baekjoon] 5567_๊ฒฐํผ์ (0) | 2022.01.25 |
[Baekjoon] 1012_์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2022.01.11 |