[BOJ][⚪2][백준#14248] 점프 점프

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #14248


문제

영우는 개구리다 개굴개굴개굴 영우는 지금 n개의 돌이 일렬로 놓여있는 돌다리에 있다. 그리고 돌다리의 돌에는 숫자가 하나씩 적혀있다. 영우는 이 숫자가 적혀있는 만큼 왼쪽이나 오른쪽으로 점프할 수 있는데, 이때 돌다리 밖으로 나갈 수는 없다. 영우는 이 돌다리에서 자기가 방문 가능한 돌들의 개수를 알고 싶어한다. 방문 가능하다는 것은 현재위치에서 다른 돌을 적절히 밟아 해당하는 위치로 이동이 가능하다는 뜻이다. 현재 위치가 주어졌을 때, 영우가 방문 가능한 돌들의 개수를 출력하시오.


입력

첫 번째 줄에는 돌다리의 돌 개수 n이 주어진다.(1≤n≤100,000) 돌의 번호는 왼쪽부터 1번에서 n번이다. 다음 줄에는 그 위치에서 점프할 수 있는 거리 Ai가 주어진다.(1≤Ai≤100,000) 다음 줄에는 출발점 s가 주어진다.(1≤s≤n)


출력

영우가 방문 가능한 돌들의 개수를 출력하시오.


예제

입력

5
1 4 2 2 1
3


출력

5


My Sol

import sys
input = sys.stdin.readline
from collections import deque

N = int(input())
arr = [0] + list(map(int, input().split()))
s = int(input())
cnt = 1
Q = deque([s])
S = set()
while Q:
    k = Q.popleft()
    step = arr[k]

    a = k-step
    if not a in S and a > 0:
        S.add(a)
        cnt += 1
        Q.append(a)

    b = k + step
    if not b in S and b <= N:
        S.add(b)
        cnt += 1
        Q.append(b)

print(cnt)

set과 범위 체크로 쉽게 해결할 수 있는 문제였다.

  1. 입력을 처리해준다.
  2. 양쪽으로 뛰었을 때, 왼쪽은 0보다 커야 하고, 오른쪽은 N보다 작거나 같아야 한다.
  3. 만약 방문한 적이 없고, 범위 내라면 S에 도착 위치를 넣어 방문 체크를 하고 cnt를 1 증가시킨다.
  4. 그리고 방문 위치로부터 또 점프를 하기 위해 deque에 넣는다.


결과

맞았습니다!!

댓글남기기