๊ทธ๋ํ ํ์ ๋ฌธ์ ์ธ๋ฐ ์ํ์ ์ผ๋ก ๋จธ๋ฆฌ๋ฅผ ์ ๊ตด๋ ค์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ํ์ํด์ผ ํ๋ ๋ฌธ์ ์๋ค. ๊ณ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ ์ ์ด๊ฒ์ ๊ฒ ๊ท์น์ ์ถ๊ฐํ๋ค๊ฐ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ฑ๊ณตํ๋ค.
๐ผ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1697
- ํฐ์ด: ์ค๋ฒ I
- ๋ถ๋ฅ: ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์
โ TRIAL 1.
์ฝ๋
from collections import deque
walk_left = lambda x: x-1
walk_right = lambda x: x+1
jump = lambda x:2*x
def actions(v, end):
if v > end:
return [walk_left]
else:
return [walk_left, walk_right, jump]
def bfs(start, end):
visited = [start]
queue = deque([(0, start)])
while queue:
curr_time, curr_v = queue.popleft()
if curr_v == end:
return curr_time
for action in actions(curr_v, end):
new_v = action(curr_v)
if 0 < new_v and new_v not in visited:
visited.append(new_v)
queue.append((curr_time+1, new_v))
N, K = map(int, input().split())
print(bfs(N, K))
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ.
โ TRIAL 2.
์ฝ๋
from collections import deque
walk_left = lambda x: x-1
walk_right = lambda x: x+1
jump = lambda x:2*x
def actions(v, end):
if v == 0:
return [walk_right]
if v > end:
return [walk_left]
elif 2*end <= 3*v:
return [walk_left, walk_right]
else:
return [walk_left, walk_right, jump]
def bfs(start, end):
if end < start:
return start - end
visited = [start]
queue = deque([(0, start)])
while queue:
curr_time, curr_v = queue.popleft()
if curr_v == end:
return curr_time
for action in actions(curr_v, end):
new_v = action(curr_v)
if new_v not in visited:
visited.append(new_v)
queue.append((curr_time+1, new_v))
N, K = map(int, input().split())
print(bfs(N, K))
์์ ํ ๋ถ๋ถ
- ๊ฐ node์์ action์ ๊ฐฏ์์ ๋ฐ๋ผ ๊ทธ๋ํ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ action์ ๊ฐฏ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ์กฐ๊ฑด์ ์ถ๊ฐํจ.
- ํ์ฌ ์์น๊ฐ 0์ผ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ผ๋ก๋ง ์ด๋ํ๊ฒ ํ๊ณ , ์๊ฐ์ด๋(2๋ฐฐ) ํ์ ๋ end์ 2๋ฐฐ๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ์๋ jump๋ฅผ ํ์ง ์๋๋ก ํจ.
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ.
โ TRIAL 3.
์ฝ๋
from collections import deque
walk_left = lambda x: x-1
walk_right = lambda x: x+1
jump = lambda x:2*x
def actions(v, end):
if v == 0:
return [walk_right]
else:
return [walk_left, walk_right, jump]
def bfs(start, end):
if end <= start:
return start - end
times = set()
visited = [start]
queue = deque([(0, start)])
while queue:
curr_time, curr_v = queue.popleft()
new_time = curr_time + 1
for action in actions(curr_v, end):
new_v = action(curr_v)
if new_v not in visited:
visited.append(new_v)
if new_v == end:
times.add(new_time)
return min(times)
elif new_v > end:
times.add(new_time + new_v - end)
else:
queue.append((new_time, new_v))
N, K = map(int, input().split())
print(bfs(N, K))
์์ ํ ๋ถ๋ถ
- ํ์ฌ ์์น๊ฐ end๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์๋ ๊ฒฝ์ฐ, ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ์ ํ์ง๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฒฝ์ฐ ํ์์ ์ข ๋ฃํ๊ณ curr_v-end ๋งํผ์ ์๊ฐ์ curr_time์ ๋ํ ๊ฐ์ times set์ ๊ธฐ๋กํจ. ๋ชฉํ๊ฐ์ ์ฐพ์์ ๋, times set์ ๊ฐ๋ค๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ฅ ์์ ๊ฐ์ return ํจ.
- queue์์ pop ํ ๊ฐ๋ค์ ๋ํด ๊ฒ์ฌ๋ฅผ ์งํํ์ง ์๊ณ , new_v๋ฅผ ๊ตฌํ ์งํ์ ๊ฒ์ฌ๋ฅผ ์งํํจ. ์ฆ node๋ฅผ ๋ฐฉ๋ฌธํ ์งํ์ ํด๋น node์ ๊ฐ์ end์ ๋น๊ตํ๋ค. ์ด๋ ๊ฒ ํ์ง ์๊ณ queue์์ popํ ๋ค์์ ๊ฒ์ฌ๋ฅผ ์งํํ๋ฉด, node๊ฐ end์ ๋๋ฌํ์ด๋ ํด๋น depth์ node๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ ์ดํ์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด ๋นํจ์จ์ ์ด๋ค.
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ. ์กฐ๊ฑด์ ์ด๊ฒ์ ๊ฒ ์ถ๊ฐํด๋ดค์ง๋ง ์์ธ์ visited์ ์์๋ค. ๋๋ visited๋ฅผ ๋น array๋ก ๋ง๋ค๊ณ , ๋ฐฉ๋ฌธํ node๋ฅผ ์ฐจ๋ก๋๋ก appendํ๊ณ node๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ํด๋น node๊ฐ visited์ ์๋์ง ๊ฒ์ฌํ๋๋ฐ, ์ด๋ array์ ๋ชจ๋ ๊ฐ์ ํ์ํ๊ธฐ ๋๋ฌธ์ O(n) ์๊ฐ์ด ์์๋จ.
์ด๋ ๊ฒ ํ์ง ๋ง๊ณ False๋ก ๊ตฌ์ฑ๋ array๋ฅผ ๋ง๋ค๊ณ ๋ฐฉ๋ฌธํ์ ๋๋ง๋ค True๋ก ๋ฐ๊ฟ์ฃผ์ด node๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ํด๋น ๊ฐ์ด True/False์ธ์ง ๊ฒ์ฌํ๊ฒ ํ์ด์ผ ํ๋ค.
๐ก Solution
์ฝ๋
from collections import deque
walk_left = lambda x: x-1
walk_right = lambda x: x+1
jump = lambda x:2*x
def actions(v, end):
if v == 0:
return [walk_right]
else:
return [walk_left, walk_right, jump]
def bfs(start, end, visited):
if end <= start:
return start - end
times = set()
visited[start] = True
queue = deque([(0, start)])
while queue:
curr_time, curr_v = queue.popleft()
new_time = curr_time + 1
for action in actions(curr_v, end):
new_v = action(curr_v)
if not visited[new_v]:
visited[new_v] = True
if new_v == end:
times.add(new_time)
return min(times)
elif new_v > end:
times.add(new_time + new_v - end)
else:
queue.append((new_time, new_v))
N, K = map(int, input().split())
visited = [False] * (2*K)
print(bfs(N, K, visited))
์ฝ๋ ์ค๋ช
- ํ์ฌ ์์น์์ ์ผ์ชฝ์ผ๋ก ์ด๋/์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋/์๊ฐ์ด๋(2๋ฐฐ) ๋ก ๊ฐ๋ ์์น๋ค์ bfs๋ก ํ์ํ๋ค.
- ๋ง์ฝ ํ์ฌ ์์น๊ฐ end ๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด, ์ผ์ชฝ์ผ๋ก ์ด๋๋ฐ์ ์ ํ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ง์ ํ์์ ์ข ๋ฃํ๊ณ ๋จ์ ์๊ฐ์ ๊ณ์ฐํ์ฌ times set์ ์ถ๊ฐํ๋ค.
- ๋ง์ฝ ํ์ฌ ์์น๊ฐ end์ ๋๋ฌํ๋ฉด ๋ชจ๋ ํ์์ ์ข ๋ฃํ๊ณ , times set์ ์๊ฐ๋ค๊ณผ ํ์ฌ ์๊ฐ์ ๋น๊ตํด ๊ฐ์ ์์ ๊ฐ์ returnํ๋ค.
์ฃผ์ํ ์
- ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ๋ด์ visited array๋ v in visited๋ก ๊ฒ์ฌํ๋ฉด visited์ ๋ชจ๋ ์์๋ฅผ ๋ค ๊ฒ์ฌํดํ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๊ฑธ๋ฆฐ๋ค. ์ฒ์์ False๋ก ๊ตฌ์ฑ๋ array๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ผ๋ก ํด์ผ ํจ.
- BFS์์ queue์ ๊ฐ์ ๋ฃ๊ธฐ ์ ์ ์ข ๋ฃ ์ฌ๋ถ ๊ฒ์ฌ๋ฅผ ํด์ผ ํ๋ค. queue์์ pop ํ ์ดํ์ ๊ฒ์ฌํ๋ฉด, ์กฐ๊ฑด์ด ๋ฌ์ฑ๋ ์ดํ์๋ ๊ฐ์ depth์ node๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.
'๐ CS > ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 14500๋ฒ] ํ ํธ๋ก๋ฏธ๋ ธ (python/ํ์ด์ฌ) (2) | 2022.09.14 |
---|---|
[๋ฐฑ์ค 7569๋ฒ] ํ ๋งํ (python/ํ์ด์ฌ) (0) | 2022.09.09 |
[๋ฐฑ์ค 16926๋ฒ] ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 1 (python/ํ์ด์ฌ) (0) | 2022.07.05 |
[๋ฐฑ์ค 2504๋ฒ] ๊ดํธ์ ๊ฐ (python/ํ์ด์ฌ) (0) | 2022.07.01 |
[๋ฐฑ์ค 1012๋ฒ] ์ ๊ธฐ๋ ๋ฐฐ์ถ (python/ํ์ด์ฌ) (0) | 2022.06.29 |