๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/11725)
<ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ>
๋ฌธ์
๋ฃจํธ ์๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋, ํธ๋ฆฌ์ ๋ฃจํธ๋ฅผ 1์ด๋ผ๊ณ ์ ํ์ ๋, ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ธ๋์ ๊ฐ์ N (2 ≤ N ≤ 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ ํธ๋ฆฌ ์์์ ์ฐ๊ฒฐ๋ ๋ ์ ์ ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋ ๋ฒํธ๋ฅผ 2๋ฒ ๋ ธ๋๋ถํฐ ์์๋๋ก ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- ์ด๊ธฐ ์ฝ๋: ์๊ฐ ์ด๊ณผ
import sys
def bfs(graph, start, result):
visited=[start]
queue=[start]
while queue:
temp=queue.pop(0)
for i in graph[temp]:
if i not in visited:
visited.append(i)
result[i-1]=temp
queue.append(i)
if __name__=='__main__':
n=int(input()) # ๋
ธ๋์ ๊ฐ์
graph={1:[]} # ํธ๋ฆฌ์ ๋ฃจํธ
for i in range(n-1):
x,y=map(int ,sys.stdin.readline().split()) # ์ฐ๊ฒฐ๋ ๋ ์ ์
if x not in graph:
if y in graph:
graph[y].append(x)
graph[x]=[]
elif y not in graph:
if x in graph:
graph[x].append(y)
graph[y]=[]
result=[0]*n
bfs(graph, 1,result)
for i in range(1,n):
print(result[i])
โ ์ด๋์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋๊ฐ?
์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ๋ถ๋ถ์ ์ฐพ์ง ๋ชปํด ๊ฒ์์ ํด๋ณด๋ not in๊ณผ append๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์๋ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์๋ค.
๊ทธ๋์ ๋ฐฉ๋ฌธ์ ํ๋ฉด list์ ๋ฃ์ด์ฃผ๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋ชจ๋ ๋ ธ๋๋ฅผ False๋ก ์ ์ธํ ํ ๋ฐฉ๋ฌธํ์ผ๋ฉด True๋ก ๋ฐ๊ฟ์ฃผ๋๋ก ํ๋ ์ฝ๋๋ก ๊ณ ์ณค๋๋ ์๊ฐ ์ด๊ณผ๋ ํด๊ฒฐํ ์ ์์๋ค.
โ ๊ทธ๋ผ ์ ํ๋ ธ๋๊ฐ?
์์ธ๋ฅผ ๊ณ ๋ คํ์ง ๋ชปํ๋ค. ๋ด๊ฐ ๊ตฌํํ ์ฝ๋๋ ์ ๋ ฅ์ด ์ฐจ๋ก๋๋ก ์ ๋ค์ด์์ผ ๊ฒฐ๊ณผ๊ฐ ์ ๋๋ก ๋์ค๋ ์ฝ๋์๋ค.
๋ง์ฝ ์ ๋ ฅ๋ฐ๋ ๋ถ๋ถ์์ ์์ง dict์ key๊ฐ์ ์๋ ๊ฐ๋ค์ด ๋์๋ค๋ฉด ๊ทธ ๋ ธ๋๋ค์ ์ถ๋ ฅ์์ 0์ด ๋์ฌ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด
5
1 3
2 4
3 4
2 5
์ ๊ฐ์ ์์ ์ด๋ค. ์ด ๊ฒฝ์ฐ 2์ ๋ถ๋ชจ ๋ ธ๋๊ฐ 4๊ฐ ์ถ๋ ฅ๋์ด์ผ ํ์ง๋ง ์์ ์ฝ๋๋ก๋ 0์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ด ๋ถ๋ถ์ ํด๊ฒฐํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค. ์ง์ง ์ค๋ ๊ฑธ๋ฆฐ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค 1์๊ฐ๋ฐ์ ์ ์ง๋ฌ๋ค๋ ๊ฒ์ ์ถฉ๊ฒฉ ๋จน์
์ฒ์์๋ ๋ ธ๋ ๋ ๊ฐ ๊ฐ ๋ค key๊ฐ์ ์๋ค๋ฉด ๋ ธ๋ ๋ ๊ฐ๋ฅผ ๋งจ ๋ค๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ํํ์๋ค.
๊ตฌํํ๋ฉด์๋ ์๊ฐ ์ด๊ณผ ๋ ๊ฒ์์ ํ์ ํ์ง๋ง ํน์ ๋ชฐ๋ผ ๋์ ํด๋ดค๋ค.
๊ฒฐ๊ณผ๋ 53%์์ ์๊ฐ ์ด๊ณผ ๋ฐ์
์ ๋ง ๋ชฐ๋ผ ๊ฒ์์ ํ์ ๋น๋ ธ๋ค. ์ ์ด ๊ฐ๋จํ ์๊ฐ์ ๋ชปํ๋ ์ถ์ ์ ๋๋ก ๋จ์ํ๊ฒ ์๋ฐฉํฅ์ผ๋ก dict์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค๋ ์์ฃผ ํฐ hint๋ฅผ ์ป์ด๋ฒ๋ ธ๋ค. ์์ ๊ฐ์ ๋์ ์ฝ๋์์ ์๋ฐฉํฅ์ผ๋ก ๋ฃ์ด์ฃผ๋ ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋ฐ๋ก ํต๊ณผํ ์ ์์๋ค.
- my solution
import sys
def bfs(graph, start, result):
visited=[False]*len(result) # ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited[start-1]=True
queue=[start]
while queue:
temp=queue.pop(0)
for i in graph[temp]:
if visited[i-1]==False: # ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
visited[i-1]=True # ๋ฐฉ๋ฌธ
result[i-1]=temp # ๋ถ๋ชจ ๋
ธ๋ ์ ์ฅ
queue.append(i)
if __name__=='__main__':
n=int(input()) # ๋
ธ๋์ ๊ฐ์
graph={}
for i in range(1,n+1):
graph[i]=[]
for i in range(n-1):
x,y=map(int ,sys.stdin.readline().split()) # ์ฐ๊ฒฐ๋ ๋ ์ ์
graph[x].append(y)
graph[y].append(x)
result=[0]*n
bfs(graph, 1,result)
for i in range(1,n):
print(result[i])
์์ ํ๋ฆฐ ์ฝ๋๋ณด๋ค ๋ ๊ฐ๋จํด์ง ํต๊ณผํ ์ฝ๋์ด๋ค.
- bfs
: visited = ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ธํ๋ list
: queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต = ์ ์ผ ์ฒ์ ๊ฐ์ pop ํด์ ๊ทธ์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธ ํ ๋ถ๋ชจ ๋ ธ๋ ์ ์ฅ ๋ฐ queue์ ์ ์ฅ - main
: ๋ ธ๋์ ๊ฐ์ ์ ๋ ฅ
: ๋ ธ๋์ ๊ฐ์๋งํผ dict์ key ์์ฑ
: ์ฐ๊ฒฐ๋ ๋ ์ ์ ์ ๋ ฅ - ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋๊ตฌ์ธ์ง ๋ชจ๋ฅด๋ฏ๋ก ์๋ฐฉํฅ์ผ๋ก ์ ์ฅ
: result = ๋ถ๋ชจ ๋ ธ๋ ์ ์ฅํ list
์๊ฐ๐ค
๋ช ๋ฒ์ ๊ณ ๋น์ ๊ฒ์์ ํ์ ๋น๋ ธ์ง๋ง ๊ทธ๋๋ ํด๊ฒฐํด์ ๋ง์์ด ํธ์ํด์ก๋ค.
๊ฐ๋์ ๋จ์ํ๊ฒ ์๊ฐํด๋ณด์
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 9465_์คํฐ์ปค (0) | 2022.03.15 |
---|---|
[Baekjoon] 2644_์ด์๊ณ์ฐ (0) | 2022.03.14 |
[Baekjoon] 2502_๋ก ๋จน๋ ํธ๋์ด (0) | 2022.03.10 |
[Baekjoon] 11048_์ด๋ํ๊ธฐ (0) | 2022.03.09 |
[Baekjoon] 1389_์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น (0) | 2022.03.08 |