์๊ณ ๋ฆฌ์ฆ/๊ทธ๋ํ
[๋ฐฑ์ค 2251 ๐ฅ] ๋ฌผํต
1eehyunji
2023. 9. 24. 01:33
https://www.acmicpc.net/problem/2251
2251๋ฒ: ๋ฌผํต
๊ฐ๊ฐ ๋ถํผ๊ฐ A, B, C(1≤A, B, C≤200) ๋ฆฌํฐ์ธ ์ธ ๊ฐ์ ๋ฌผํต์ด ์๋ค. ์ฒ์์๋ ์์ ๋ ๋ฌผํต์ ๋น์ด ์๊ณ , ์ธ ๋ฒ์งธ ๋ฌผํต์ ๊ฐ๋(C ๋ฆฌํฐ) ์ฐจ ์๋ค. ์ด์ ์ด๋ค ๋ฌผํต์ ๋ค์ด์๋ ๋ฌผ์ ๋ค๋ฅธ ๋ฌผํต์ผ๋ก ์์ ๋ถ
www.acmicpc.net
๋ฌธ์ ํ์ด
- BFS๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํ ์ ์๋ ๋ฌธ์ ๋ค.
- ํ ๋ฌผํต์์ ๋ค๋ฅธ ๋ฌผํต์ผ๋ก ๋ฌผ์ ์ฎ๊ธธ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ 6๊ฐ์ง์ด๋ค.
- 1๋ฒ ๋ฌผํต -> 2๋ฒ ๋ฌผํต
- 1๋ฒ ๋ฌผํต -> 2๋ฒ ๋ฌผํต
- 2๋ฒ ๋ฌผํต -> 1๋ฒ ๋ฌผํต
- 2๋ฒ ๋ฌผํต -> 3๋ฒ ๋ฌผํต
- 3๋ฒ ๋ฌผํต -> 1๋ฒ ๋ฌผํต
- 3๋ฒ ๋ฌผํต -> 2๋ฒ ๋ฌผํต
- ๋ฌผ์ ์ฃผ๋ ๋ฌผํต์ ๋ฌผ์ด ๋ค ๋น์์ง๊ฑฐ๋, ๋ฌผ์ ๋ฐ๋ ๋ฌผํต์ด ๊ฝ ์ฑ์์ง ๋๊น์ง ๋ถ์ด์ผ ํ๋ค.
- BFS ํ์์ ์ํด์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์์ ๋ ๋ฌผํต์ ๋น์์ ธ ์๊ณ , ์ธ ๋ฒ์งธ ๋ฌผํต๋ง ๊ฝ ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ์ธ (0,0,C)๋ฅผ ํ์ ๋ฃ์ด์คฌ๋ค.
- ๊ทธ๋ฆฌ๊ณ visited๋ฅผ set ์๋ฃํ์ผ๋ก ์ ์ธํด์ ์์๋ฅผ ์ถ๊ฐํด์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๊ณ , ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด in ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ์์ ์๊ฐ ๋ด์ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
- ๋ฌธ์ ๋ฅผ ํ๊ณ ๋์ ๋ชจ๋ฒ ๋ต์ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๋ visited[A][B][C]์ True/False๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ๋ ์์๋ค!
- while queue๋ฅผ ๋๋ฉด์ ํ์ฌ ๋ฌผํต์ ์ํ๋ฅผ popํ๊ณ , ์์ ์ ์ด๋ ๋ฌผ์ ์ฎ๊ธธ ์ ์๋ ๊ฐ ๊ฒฝ์ฐ์ ๋ํด ๊ณ์ฐํ๋ค.
- ์๋ฅผ ๋ค์ด 1๋ฒ ๋ฌผํต์ ๋ฌผ์ 2๋ฒ ๋ฌผํต์ผ๋ก ๋ถ๋ ๊ฒฝ์ฐ, 1๋ฒ ๋ฌผํต์ ๋ฌผ๊ณผ 2๋ฒ ๋ฌผํต์ ๋ฌผ์ ํฉ์ณค์ ๋ 2๋ฒ ๋ฌผํต์ ์ฉ๋ B๋ณด๋ค ์ปค์ง๋ฉด, 1๋ฒ ๋ฌผํต์ ๋ชจ๋ ๋ฌผ์ ๋น์ธ ์๋ ์๋ค. ๊ทธ๋์ 2๋ฒ ๋ฌผํต์ ๋ถ์ธ ์ ์๋ ๋งํผ๋ง ๋ถ๊ณ , ๋๋จธ์ง๋ 1๋ฒ ๋ฌผํต์ ๋จ๋๋ค.
- (1๋ฒ ๋ฌผํต์ ๋ฌผ + 2๋ฒ ๋ฌผํต์ ๋ฌผ - B)
- ๋, 1๋ฒ ๋ฌผํต์ ๋ชจ๋ ๋ฌผ์ ๋ถ์ธ ์ ์๋ ๊ฒฝ์ฐ์ 1๋ฒ ๋ฌผํต์ ๋ฌผ์ ์์ 0์ด ๋๊ณ , 2๋ฒ ๋ฌผํต์ (1๋ฒ ๋ฌผํต ๋ฌผ์ ์ + 2๋ฒ ๋ฌผํต ๋ฌผ์ ์)์ด ๋๋ค.
- ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ์์ ๊ฐ์ ๊ณ์ฐ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ณ , BFS ํ์ ๊ณผ์ ์์ 1๋ฒ ๋ฌผํต์ ์ a๊ฐ 0์ธ ๊ฒฝ์ฐ์ 3๋ฒ ๋ฌผํต์ ์ c๋ฅผ ans ๋ฐฐ์ด์ ์ถ๊ฐํด์ค๋ค.
- ans๋ฅผ ์ ๋ ฌํ๊ณ , ์ถ๋ ฅํด์ฃผ๋ฉด ๋
import sys
from collections import deque
A,B,C=map(int, sys.stdin.readline().strip().split(' '))
queue=deque()
queue.append((0,0,C))
visited=set()
ans=[]
while queue:
a,b,c=queue.popleft()
if (a,b,c) in visited:
continue
visited.add((a, b, c))
if a==0:
ans.append(c)
# 1->2
if a+b>B:
# 1->2๋ก ๋ฌผ์ ๋ถ์ ๋ 2์ ์ฉ๋์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
queue.append((a+b-B, B, c))
else:
queue.append((0,a+b,c))
# 1->3
if a+c>C:
queue.append((a+c-C,b,C))
else:
queue.append((0,b,a+c))
# 2->1
if a+b>A:
queue.append((A,a+b-A,c))
else:
queue.append((a+b, 0,c))
# 2->3
if b+c>C:
queue.append((a, b+c-C,C))
else:
queue.append((a, 0, b+c))
# 3->1
if a+c>A:
queue.append((A, b, a+c-A))
else:
queue.append((a+c, b, 0))
# 3->2
if b+c>B:
queue.append((a,B,b+c-B))
else:
queue.append((a,b+c,0))
ans.sort()
print(*ans, sep=' ')