-
반응형
1. 문제 조건
- 곡의 개수 N, 시작 볼륨 S, max 볼륨 M
- 매번 곡 연주를 시작하기 전에 볼륨 조정을 하는데 볼륨 조정이 가능한 값이 V리스트에 담겨있음
- ex) max 볼륨이 10, 시작 볼륨이 5, V[0]이 3이면 될 수 있는 볼륨 값은 2 or 8
2. 풀이 전 생각정리
- 볼륨 조정이 들어갈 때마다 가능한 볼륨의 가짓수는 2배로 늘어난다. 단 가능한 볼륨값 범위 안에 속하지 않은 옵션들은 없애줘야 한다.
- 볼륨 조정이 있을 때마다 가능한 볼륨의 크기를 담고, 다음 볼륨 조정이 있을 때 다시 확장시키는 방법?
- (N+1)*(M+1) 크기의 0으로 초기화된 리스트를 만들어 볼륨 조정을 하나씩 해가며 발생할 수 있는 경우를 1로 표시해놓기?
3. 메모리 초과 뜬 코드
- 볼륨 조정을 하기 전마다 가능한 볼륨 크기를 dp에 정수 형태로 담고
- 볼륨조정을 하며 기존의 볼륨을 조정하여 가능한 볼륨크기를 다시 dp에 정수 형태로 담기
N, S, M = map(int, input().split()) V = list(map(int, input().split())) dp = [] dp.append(S) for i in range(len(V)): temp_list = [] while dp: temp_num = dp.pop() if 0<=temp_num+V[i]<=M: temp_list.append(temp_num+V[i]) if 0<=temp_num-V[i]<=M: temp_list.append(temp_num-V[i]) dp = temp_list if len(dp)==0: print(-1) else: print(max(dp))
4. 성공 코드
- (N+1)*(M+1) 이차원 리스트를 0으로 초기화한 뒤 볼륨 조정이 들어갈 때마다 가능한 옵션들을 1로 표기
- 행은 몇 번째 볼륨 조정 이후 결과인지를 뜻하고, 열은 가능한 볼륨을 뜻함
- ex) 0행에는 초기 볼륨 값의 열에만 1이 표기, 1행에는 첫 번째 볼륨 조정 이후 가능한 볼륨 크기를 의미하는 열들에만 1 표기
N, S, M = map(int, input().split()) V = list(map(int, input().split())) dp = [[0]*(M+1) for _ in range(N+1)] dp[0][S] = 1 for i in range(1,N+1): for j in range(M+1): if dp[i-1][j]>0: #j가 음 높이 if j + V[i-1]<=M: dp[i][j+V[i-1]] = 1 if j - V[i-1]>=0: dp[i][j-V[i-1]] = 1 result = -1 for i in range(M,-1,-1): if dp[N][i]==1: result = i break print(result)
반응형'IT > 백준' 카테고리의 다른 글
[백준] 11053 가장 긴 증가하는 부분 수열(Python) (0) 2021.10.11 [백준] 12865 평범한 배낭(Python) (0) 2021.10.11 [백준] 9251 LCS (Python) (0) 2021.10.05 [백준] 17472 다리만들기2 (Python) (0) 2021.08.24 댓글