0. 문제 링크
https://www.acmicpc.net/problem/1495
1495번: 기타리스트
첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.
www.acmicpc.net
1. 풀이 방법
보통 n * (m + 1)의 배열을 만들어서 처리하는 것 같은데, 나는 그러고 싶지 않았다.
따라서 m + 1을 n번 반복하는 식으로 풀었다.
최종적으로 n번 반복 후에
배열 대신에
BFS
와 흡사하지만 DP
다.따라서 m + 1을 n번 반복하는 식으로 풀었다.
최종적으로 n번 반복 후에
dp
에 남아있는 값들 중 하나가 결과가 된다.배열 대신에
check
를 사용하여 이미 설정한 볼륨은 넣지 않았고, deque
를 사용하여 설정한 볼륨에 대한 정보를 가져왔다.참고로 다음 연주 시에는
check
변수를 초기화 시켰다.2. 코드
from collections import deque
[n, s, m], board = map(int, input().split()), map(int, input().split())
dp = deque([s])
for i in board:
check = set() # 다음 연주 전에는 방문 리스트를 초기화 해야 함
for _ in range(len(dp)): # 기존의 dp 길이만큼 반복함
s = dp.popleft() # 현재 볼륨을 받아옴
for j in [s - i, s + i]: # s - i와 s + i를 반복함
if 0 <= j <= m and j not in check: # 볼륨이 범위 안에 있고, 방문하지 않았다면
dp.append(j) # dp에 넣음
check.add(j) # check에 넣어서 이미 방문한 볼륨을 방지함
print(max(dp) if len(dp) else -1)
3. 마무리
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 2294 - 동전 2 (0) | 2023.02.21 |
---|---|
[백준 - Python] 12869 - 뮤탈리스크 (0) | 2023.02.21 |
[백준 - Python] 12865 - 평범한 배낭 (0) | 2023.02.21 |
[백준 - Python] 10942 - 펠린드롬? (0) | 2023.02.21 |
[백준 - Python] 11060 - 점프 점프 (0) | 2023.02.21 |