-
반응형
1. 생각정리
- 탑을 쌓을 때 고려해야 하는 사항은 세 개다.
- 무거운 것은 무조건 아래
- 밑면이 넓은 것은 무조건 아래
- 위의 두 조건들을 만족시키면서 가장 높은 탑을 쌓을 수 있어야 함
- 일단 '밑면의 넓이' 혹은 '무게' 중 하나에 대해 정렬을 해준 뒤 코드를 짜면 생각해야 할 조건이 하나 줄어든다.
- 그리고 dp를 이용해서 하나씩 영역을 확장시키며 쌓을 수 있는 가장 높은 높이를 구할 수 있지 않을까?
- 여기서 "첫 번째까지 고려한 최대 높이는 dp [1]에", "두 번째까지 고려한 최대 높이는 dp [2]에"... 이렇게 dp를 채운 뒤
- dp리스트의 최댓값이 쌓을 수 있는 최대 높이이다.
- 그리고 mapp과 dp를 바탕으로 하나씩 기억을 더듬어가면 문제가 원하는 답을 도출할 수 있다.
2. 성공 코드
N = int(input()) mapp = [] mapp.append((1,1,1,1)) for i in range(1,N+1): a,b,c = map(int, input().split()) #(넓이, 높이, 무게) 순서 mapp.append((i,a,b,c)) #dp dp = [0]*(N+1) #무게 순으로 일단 정렬 mapp.sort(key = lambda x: x[3]) #mapp를 훑으면서 dp를 갱신 for i in range(1,N+1): for j in range(0,i): if mapp[i][1]>mapp[j][1]: #현재 넓이가 훑으며 거쳐온 이전 넓이보다 클 때 dp[i] = max(dp[i], dp[j]+mapp[i][2]) #가장 높이 쌓을 수 있는 높이 찾기 max_height = max(dp) #기억을 더듬으며 백 트래킹 index = N history = [] while index!=0: if dp[index]==max_height: history.append(mapp[index][0]) max_height-=mapp[index][2] index-=1 print(len(history)) history.reverse() for i in history: print(i)
###
마지막에
history.sort(reverse=True) 하면 틀리고
history.reverse() 하면 맞더라고요
반응형'IT > 백준' 카테고리의 다른 글
[백준] 1012 유기농 배추(Python) (0) 2021.10.13 [백준] 1697 숨바꼭질(Python) (0) 2021.10.12 [백준] 1260 DFS와 BFS(Python) (0) 2021.10.12 [백준] 11053 가장 긴 증가하는 부분 수열(Python) (0) 2021.10.11 댓글
- 탑을 쌓을 때 고려해야 하는 사항은 세 개다.