ps:problems:boj:18185
목차
라면 사기 (Small)
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 18185 |
문제명 | 라면 사기 (Small) |
레벨 | 다이아몬드 4 |
분류 |
그리디 |
시간복잡도 | O(n) |
인풋사이즈 | n<=10^4 |
사용한 언어 | Python |
제출기록 | 30864KB / 76ms |
최고기록 | 68ms |
해결날짜 | 2022/01/18 |
풀이
- 아이디어를 찾는 난이도만으로 다이아몬드로 평가받은 문제이다. 필요한 알고리즘 지식이나, 구현의 난이도는 없다고 봐도 될 수준.
- DP를 이용해서 푸는 방법이 떠오르지만, Ai의 범위가 너무 커서 쉽지 않다. dp[i][j][k] 를 i번째 공장에서까지 구입을 마쳤고, i번째 공장에서 살때 2개 묶음으로 산 갯수를 j개, 3개묶음으로 산 갯수를 k개인 상태에서의 최소가격으로 표현해서 이를 기반으로 점화식을 세울수 있지만, 테이블의 크기가 O(n*m*m)으로 최대 10^12 가 되어서 이 풀이는 무리이다.
- 관찰을 하면 공장 1개에서 사는 것보다, 공장 2개나 3개에서 묶어서 사는 것이 더 효율적이다. 앞에서부터 보면서 최대한 3개로 묶어서 사고, 안되는 경우 최대한 2개로 묶어서 사고, 나머지는 개별로 사는 그리디 풀이를 떠올릴수 있지만 이는 1 2 1 1 이라는 반례에 걸린다. (사실 이 반례를 찾는것이 쉽지 않았다)
- 조금 더 관찰을 해서 발견할수 있는 것은, 4개를 살 때 3개와 1개로 사는것과 2개와 2개로 사는 것의 가격이 똑같다는 것이다. 가격이 똑같다면 i번째 공장까지 2개묶음으로 산 경우가, i+1번째 공장에서 3개 묶음으로 확장시킬 여지가 있기 때문에, 3개 묶음으로 사는것보다 더 유리하다. 그래서 결국 최적 전략은, i-1번째 공장까지 1개묶음, 2개묶음, 3개묶음으로 산 것들에 대해서, i번째 공장에서는 제일먼저 1개묶음을 2개묶음으로 최대한 늘리고, 물건이 남으면 2개묶음을 3개묶음으로 늘리고, 그러고도 남는 물건들에 대해서는 그냥 1개묶음으로 사는 것이 된다.
- 시간복잡도는 O(n)이다.
- 라면 사기 (Large)도 동일한 알고리즘으로 풀린다.
코드
(다이아몬드 이상은 코드 첨부 생략)
ps/problems/boj/18185.txt · 마지막으로 수정됨: 2022/01/18 15:01 저자 teferi
토론