ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

11060๋ฒˆ: ์ ํ”„ ์ ํ”„

์žฌํ™˜์ด๊ฐ€ 1×N ํฌ๊ธฐ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ์นธ์—๋Š” ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์“ฐ์—ฌ ์žˆ๋‹ค. i๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋ฅผ Ai๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ์žฌํ™˜์ด๋Š” Ai์ดํ•˜๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๏ฟฝ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 1xN์˜ ๋ฏธ๋กœ์—๋Š” ๊ฐ ์นธ์— ์ •์ˆ˜๊ฐ€ ์ ํ˜€์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์นธ์— 3์ด ์ ํ˜€์žˆ๋‹ค๋ฉด ํ˜„์žฌ ์œ„์น˜์—์„œ +1, +2, +3์œผ๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์ตœ์†Œํ•œ์œผ๋กœ ์ ํ”„ํ•˜์—ฌ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒฝ์šฐ ์ ํ”„ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 

 ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” BFS๋ฅผ ํ†ตํ•ด, ํ˜„์žฌ ์œ„์น˜์—์„œ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ BFS๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ๋„ ๋‹ต์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋Š” -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

 

  • BFS๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ์žˆ์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
    • ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ N๋ณด๋‹ค ์ž‘์€๊ฐ€?
      • N๋ณด๋‹ค ์ปค์ง„๋‹ค๋ฉด ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
      • ์ธ๋ฑ์Šค ์˜ค๋ฅ˜๋„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
    • ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์นธ์˜ ์ ํ”„ ๊ฐ€๋Šฅํ•œ ์ˆ˜๊ฐ€ 0๋ณด๋‹ค ํฐ๊ฐ€?
      • 0์ด๋ผ๋ฉด ํ•ด๋‹น ์นธ์—์„œ ์ ํ”„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํƒ์ƒ‰์—์„œ ์ œ์™ธํ•œ๋‹ค.
    • ํ•œ ๋ฒˆ์ด๋ผ๋„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋Š”๊ฐ€?
      • ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด 3์นธ์„ ๋›ฐ๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์นธ์—์„œ 1, 2, 3 ์•ž์˜ ์นธ์„ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค.
      • ๋”ฐ๋ผ์„œ ์žฌ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque


def visitable(idx):
    return idx < n and a[idx] > 0 and not visited[idx]


def bfs(start):
    q = deque([start])

    while q:
        idx, cnt = q.popleft()
        if idx + 1 == n:
            return cnt

        for i in range(a[idx] + 1):
            next_idx = idx + i

            if visitable(next_idx):
                visited[next_idx] = True
                q.append((next_idx, cnt + 1))
    return -1


if __name__ == '__main__':
    n = int(stdin.readline())
    a = list(map(int, stdin.readline().split()))
    visited = [True] + [False] * (n - 1)
    print(bfs([0, 0]))
728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€