||문제 이해
주어지는 여러 무게의 추를 조합하여 만들 수 없는 최소 무게를 구해라
||해결 계획
Greedy를 사용한다.
오름차순으로 정렬 후, [ i번째 까지의 누적합 + 1 < i번째 추의 무게 ] 가 true면
i번째 까지의 누적합 + 1이 정답이다.
||계획 검증
만들수 있는 최대 무게를 m이라 가정한다.
그럼 0 ~ m 의 무게를 만들수 있다.
여기서 무게 k인 추를 추가할 때 k가 m보다 + 1만큼 무겁다고 가정하자.
그럼 다시 만들수 있는 무게는 0, 1, 2, ..... m, k, k+1, k+2, ...... k + m 이 가능하다.
이런 범위는 k가 k <= m + 1 라면 k + m이하인 무게를 만들수 있는건 변함없다.
반면 k가 m보다 + 2만큼 무겁다고 가정한다.
그럼 다시 만들수 있는 무게는 0, 1, 2, ..... m, m + 1, k, k+1, k+2, ...... k + m 이 가능하다.
보다시피 m + 1은 만들수 없는 무게다.
고로 m + 1 < k 면 m + 1이 만들수 없는 최소 무게인것.
만들수 있는 무게의 범위는 모든 추의 무게를 합한것과 같다.
예를 들면
추 = { 1, 1, 3, 8 }
i번째까지 추의 누적합 : sum(i)
i번째의 추 : a(i)
sum(0) 은 0이다. 여기서 첫번째 무게 1의 추를 추가할 것이다.
sum(0) + 1 < a(1) == false 이므로 만들수 있는 무게는 0 ~ sum(0) + a(1)이다. ( 0 ~ 1)
sum(1) 은 1이다. 여기서 두번째 무게 1의 추를 추가할 것이다.
sum(1) + 1 < a(2) == false 이므로 만들수 있는 무게는 0 ~ sum(1) + a(2)이다. ( 0 ~ 2)
sum(2) 은 3이다. 여기서 세번째 무게 3의 추를 추가할 것이다.
sum(2) + 1 < a(3) == false 이므로 만들수 있는 무게는 0 ~ sum(2) + a(3)이다. ( 0 ~ 5)
sum(3) 은 5이다. 여기서 네번째 무게 8의 추를 추가할 것이다.
sum(3) + 1 < a(4) == true이므로 만들수 없는 최소 무게는 sum(3) + 1 이다. ( 6 )
||구현
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
int arr[1001];
int n; cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> arr[i];
}
sort(arr, arr + n);
int sum = 0;
for (int i = 0; i < n; ++i)
{
if (sum + 1 < arr[i]) break;
sum += arr[i];
}
cout << sum + 1;
return 0;
}
||되돌아보기
일단 자력으로 풀지 못했고
혼자 생각 못한 이유라면, 이 문제는 가정과 식을 통해 쉽게 추론할 수 있는 문제였는데
내가 아직 식으로 가정 해보는게 서툴러서 도달하지 못했던것 같다.
항상 식으로 논리있는 문제풀이를 하려고 계속 노력하고 있지만
이렇게 가정을 아직 많이 해본적은 없어서 좀 더 식으로 서술 하는 법을 배웠다.
'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글
[알고스팟 - PICNIC] 소풍 (0) | 2022.12.02 |
---|---|
[프로그래머스] 신규 아이디 추천 (0) | 2022.09.16 |
[프로그래머스] 신고 결과 받기 (0) | 2022.09.03 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.09.02 |
[백준 - 2908] 상수 (0) | 2022.09.01 |