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์ผ๊นŒ์šฅ?

- ๋ฌธ์ œ ๋ถ„์„ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค!!!