오늘은 무슨 알고리즘 문제들을 풀자! 라는 생각없이
그냥 백준 문제 목록들을 훑어보고 있었다.
근데, 이 문제가 눈에 띄었다.
https://www.acmicpc.net/problem/17528
바로, 작년 ACM regional에서 내가 붙잡고 풀다가, 결국 WA떴던 문제...
regional이 끝나고 나서도, 계속해서 풀려고 했는데, 대회장에서 생각한 아이디어를 개선할 생각만하고, 새로운 아이디어가 안떠올라서 안풀고 있었던 그문제...
근데, 또 또 또 똑같이 풀고 있는 내 모습을 보고 결국 구글에게 물어보았다.
http://blog.naver.com/PostView.nhn?blogId=njw1204&logNo=221669613809
요 블로그의 풀이를 보게 되었다.
정말 충격을 먹었다.
이게 Knapsack 문제라고?
일단, 이 아이디어를 활용해서 문제를 풀어보다가,
요 블로그에서 구현된 Knapsack 구현방법에 흥미를 가지게 되었다.
굉장히 공간복잡도를 잘 고려한 방법이었다.
그래서 이 방법을 활용해서 쌓아두었던 Knapsack 문제들을 풀자는 마음으로 쭉쭉 풀기 시작했다.
https://www.acmicpc.net/problem/10982
요 문제는 위 블로그에서 언급했듯이 Two machines 문제와 완전히 동일하다고 봐도 된다. (testcase 구현이란 숫자 범위만 고려하면 된다.)
https://www.acmicpc.net/problem/12865
https://www.acmicpc.net/problem/14728
12865번 문제와 14728번 문제는 그냥 Knapsack 문제이다. 그냥 Knapsack 쓰세요라고 말하는 문제이다. 그냥 풀자
https://www.acmicpc.net/problem/12920
요 문제는 얼핏 보면 "평범한 배낭1"과 동일하다고 생각할 수 있다.
근데, 생각해보면 같은 물건을 여러 개 선택할 수 있어서, 문제가 생긴다.
하지만 해봤자 문제상으로 한 물건을 K개씩, 최대 0000개 씩 쓸 수 있다. 이걸 2의 배수로 쪼갠다고 생각하면 쉽게 해결된다. 예를 들어 10개를 사용할 수 있다면 1, 2, 4, 3 으로 쪼개는 것이다. 이렇게 쪼개면 4개의 수로 10까지 모두 표현 가능하기 때문이다. (+ 맨마지막이 8이 아니라 3인 이유는 쪼갠 숫자들의 합이 주어진 10이어야 하기 때문이다.)
아무튼 오늘 AC 받은 Knapsack 문제는 이정도이다.
이제 Knapsack을 적당하게 구현하는 방법을 알았으니, 잘 써먹어보자.
Rmx
'내가 공부하려고 만들어가는 목록' 카테고리의 다른 글
[내공만목] BOJ 트리와 쿼리 시리즈를 풀고 싶었다.(WIP) (0) | 2020.10.26 |
---|---|
[내공만목] 대충 어린이날에 푼 골드 문제들 정리 (0) | 2020.05.05 |
[내공만목] Convex Hull 공부하기 (0) | 2020.05.01 |
[내공만목] erdos-ginzburg-ziv theorem && Zero sum problem (0) | 2020.04.11 |
[내가 공부하려고 만들어가는 목록] 목표 01 (2) | 2020.04.10 |