이 문제는 수열이 주어졌을 때, 각각의 수를 왼쪽, 오른쪽, 또는 사용치 않음으로 분류했을 때, 왼쪽 수열의 합과 오른쪽 수열의 합이 같은 경우, 그 값의 최대값이 얼마인가를 묻는 것입니다.
예를 들어서, 14 3 20 15 15 14 24 23 15 이란 값이 있다고 하죠. 그러면, 왼쪽에 [14] 오른쪽에 [14]란 수열이 있다면, 그 합이 14로 같기 때문에 같은 합이 될 수 있습니다. 하지만 이것은 최대값은 아닙니다. [14, 15]와 [14, 15]와 같이 쉽게 찾을 수 있는 값만 해도 29로 더 큰 값이 되기 때문이죠. [14, 20, 15, 15] 와 [3, 14, 24, 23] 로 나누면 64라는 최대값을 얻습니다. 여기서 중요한 것은 주어진 수열의 한 숫자는 왼쪽, 오른쪽, 또는 사용치않음 세 그룹 중 하나에 속해야 한다는 것이죠.
문제는 아래 링크에 있습니다.
https://www.acmicpc.net/problem/1126
1126번: 같은 탑
첫째 줄에 조각의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 각 조각의 높이가 주어진다. 높이는 500,000보다 작거나 같은 자연수이고, 모든 조각의 높이의 합은 500,000을 넘지 않는다.
www.acmicpc.net
이 문제는 동적 계획법을 이용해서 풀게 되는데요. 동적 프로그래밍을 그냥 이용하면 시간초과가 나오게 됩니다. 왼쪽 그룹과 오른쪽 그룹의 차이 x와 참여한 수열의 개수 n 가지고 동적계획법을 아래와 같이 작성하면,
이렇게 해서
조건을 보고서 어떻게 하면 될 것인지를 판단해야 합니다. N은 50이므로, 조합해서 나올 수 있는 경우의 수는 무려
위의 식과 비슷하지만, 매번 수열에
이렇게 해서 최종적인
하지만 이렇게 해도 시간이 좀 많이 걸리게 됩니다. 일단, 최대 250,000개가 생긴다고 할 때, 전체 위의 작업을 계속하게 되면 12,500,000 작업이 이루어지게됩니다. 그래서 저는 내림차순으로 정렬을 하고, 남은 숫자의 합이 두 그룹 사이의 차보다 작은 경우에는 그 차를 늘리지 않게 함으로써 시간 절약을 했습니다.
'Programming > BOJ' 카테고리의 다른 글
백준 #1138 한 줄로 서기 (0) | 2020.01.04 |
---|---|
백준 #1132 합 (0) | 2020.01.04 |
백준 #1113 수영장 만들기 (0) | 2020.01.04 |
백준 #1112 진법 변환 (0) | 2020.01.03 |
백준 #1111 IQ Test (0) | 2020.01.03 |
댓글