Algorithm/๋ฌธ์ ํ์ด
[Python][BoJ] ์ ํ์ ์ฉฐ๋ฆฌ (Large)
jihuSunbae
2024. 12. 4. 11:02
๐ซก Overview
์ฒด๊ฐ ๋์ด๋: โ โโโโ
์์์๊ฐ: 40๋ถ
๋ฌธ์ ๋ ๋ฒจ: ์ค๋ฒ1 / ๋ฌธ์ ์ ํ: BFS
ํ์ด ์ํ: ์ค์ค๋ก ํด๊ฒฐ
์ถํ: ๋ค์ ํ์ด๋ณด๊ธฐ
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16174
์๊ตฌ์ฌํญ ๋ถ์
๋๋ณด๊ธฐ
"""
๋ชฉ์ : ์ฃผ์ด์ง ์ด๋ ์กฐ๊ฑด์ ๋ฐ๋ผ์ ์ฉฐ๋ฆฌ๊ฐ ์ฐ์นํ ์ ์๋์ง ์์๋ณด๊ธฐ
์ ํ
- ์์์ (0,0)
- ์ด๋ ์กฐ๊ฑด
- ์ด๋ ๋ฐฉํฅ: ์ค๋ฅธ์ชฝ(0,+1) or ์๋ (-1,0)
- ์ด๋ ํฌ๊ธฐ: ํ์ฌ ๋ฐ๊ณ ์๋ ์นธ์ ์ ๋งํผ (0~100)
- ์ด๋ ์ ํ: NxN ๋งต ๋ฐ์ผ๋ก ๋๊ฐ๋ฉด ์๋จ.
์น๋ฆฌ ์กฐ๊ฑด: (N-1,N-1)๋ก ๋๋ฌ
์
๋ ฅ:
- N(2<= N <= 64)
- NxN ํฌ๊ธฐ์ ๋งต
- ์น๋ฆฌ ์ง์ : -1, ๋๋จธ์ง๋ 0~100์ ์ ์
์ถ๋ ฅ: ์ฐ์นํ ์ ์์ผ๋ฉด HaruHaru, ์๋๋ฉด Hing
"""
๋์ ์ฝ๋
๊ฐ๋จํ BFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์๋ค. ์ด๋ฐ ๋ฌธ์ ๋ค์ ์๋ ๋๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๊ฒ์ด ํ๋ ๊ฒ ๊ฐ๋ค.
- ์ฒ์์๋ While True ๋ฌธ์ ๊ณ์ ๋ฐ๋ณตํ๋ฉด์ ๋์ฐฉ์ง์ ๊ฐ๋ฉด ์ฐ์น, ์๋๋ฉด ์คํจ ์ด๋ ๊ฒ ํ๋ ค๊ณ ํ๋์ while ๋ฌธ ์ข ๋ฃ ์กฐ๊ฑด์ด ์๊ฐ๋์ง ์์.
- ๊ทธ๋์ queue๋ฅผ ํ์ฉํ์ฌ queue๊ฐ ๋น ๋๊น์ง ํ์ํ๋ ๊ฒ์ผ๋ก ๋ฐ๊ฟจ๋ค.
from collections import deque
# ์
๋ ฅ ๋ฐ๊ธฐ
N = int(input()) # 2<= N <= 64
board = [list(map(int, input().split())) for _ in range(N)] # NxN ํฌ๊ธฐ์ ๊ฒ์๋งต
def out_of_range(x,y):
if x<0 or x>=N or y<0 or y>=N:
return True
return False
def check(N, board) -> bool:
answer = False
queue = deque()
queue.append((0, 0))
visited = [[False]*N for _ in range(N)]
visited[0][0] = True
d_lst = [(0,+1),(+1,0)] # ์ค๋ฅธ์ชฝ, ์๋ ์ด๋
while queue: # ํ๊ฐ ๋น ๋๊น์ง
x,y = queue.popleft()
if x == N-1 and y == N-1:
answer = True
break
for dx,dy in d_lst:
amount = board[x][y]
nx, ny = x+(dx*amount), y+(dy*amount)
if not out_of_range(nx,ny) and not visited[nx][ny]:
visited[nx][ny] = True
queue.append((nx,ny))
return answer
result = check(N,board)
if result: print("HaruHaru")
else: print("Hing")
๋ฐฐ์ด ์ /๋๋ ์
- DP ์ ํ์ด๋ผ๋๋ฐ, ์ DP์ผ๊น์ฅ?
- ๋ฌธ์ ๋ถ์ํ๋๋ฐ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฐ๋ค!!!