알고리즘 공부/백준

(Python)백준 코딩테스트 연습 - 폴짝폴짝(1326)

HRuler 2023. 3. 18. 13:17

1. 문제

https://www.acmicpc.net/problem/1326

 

1326번: 폴짝폴짝

첫째 줄에 징검다리의 개수 N(1≤N≤10,000)이 주어지고, 이어서 각 징검다리에 쓰여 있는 N개의 정수가 주어진다. 그 다음 줄에는 N보다 작거나 같은 자연수 a, b가 주어지는 데, 이는 개구리가 a번

www.acmicpc.net

2. 풀이

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

# n : 징검다리 개수
n = int(input())

# n_l : 징검다리 숫자 리스트
n_l = list(map(int, input().split()))

# s_p, e_p : 각각 시작 위치, 도착 위치
s_p, e_p = map(int, input().split())

def jump(n, n_l, s_p, e_p):
    q = deque()
    q.append(s_p)
    visitCnt = [-1 for i in range(n)]
    visitCnt[s_p] += 1
    while q:
        c_p = q.popleft()
        for i in range(c_p, n, n_l[c_p]):
            if visitCnt[i] == -1:
                q.append(i)
                visitCnt[i] = visitCnt[c_p] + 1
                if i == e_p:
                    return visitCnt[i]
            
        for i in range(c_p, -1, -(n_l[c_p])):
            if visitCnt[i] == -1:
                q.append(i)
                visitCnt[i] = visitCnt[c_p] + 1
                if i == e_p:
                    return visitCnt[i]
    return -1
    
print(jump(n, n_l, s_p-1, e_p-1))

3. Feedback

 - 위 문제에서는 문제의 내용을 잘못이해하여 처음 해결할때 코드를 아예 잘못 작성해서 틀렸다.

 여러번 틀려가면서 뭔가 문제의 이해가 잘못되었다는 생각을 하여 다시 문제를 파악하여 코드를 수정 후 BFS 알고리즘을 사용하여 해결할 수 있었다.

 코드를 어떤 알고리즘으로 효율적으로 잘설계할지도 중요하지만, 도메인 지식 즉 이해의 기반을 정확히 해두고 코딩을 하는것 또한 중요하다.