-
프로그래머스 - 카운트 다운 [C++]문제 풀이/프로그래머스 2024. 3. 1. 21:22반응형
이 문제는 다이나믹 프로그래밍으로 풀었다.
이 문제는 싱글, 더블, 트리플, 불 네 가지의 점수를 파악하고 그 중 겹치는 것이 있으면 싱글, 불로 카운팅하는 것이 중요하다.
2의 경우 2 싱글일 수도 있지만, 1 더블일 수도 있다. 이 경우 2 싱글로 판단하도록 하는 것이다.
시간 복잡도의 경우 100,000 * 43 = 4,300,000 이므로 충분히 1초 안에 풀 수 있다.
다이나믹 프로그래밍에서 바텀업 방식이 탑다운 방식보다 확실히 빠른 것 같다. 또한 가끔 바텀업으로 생각하는게 더 쉬운 경우도 있었다. dp 문제를 풀 때 항상 탑다운으로 생각했는데, 바텀업으로도 생각해봐야할 것 같다.
#include <string> #include <vector> #include <algorithm> #include <utility> using namespace std; #define INF 1000000000 #define MAX 100000 vector<int> scores = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20,21, 22,24,26,27,28,30,32,33,34,36,38, 39,40,42,45,48,50,51,54,57,60 }; pair<int, int> dp[MAX + 300]; bool singleOrBool(int dart) { if ((1 <= dart && dart <= 20) || dart == 50) { return true; } return false; } void init() { for (int i = 0; i < MAX + 300; i++) { dp[i] = {INF, INF}; } } vector<int> solution(int target) { init(); dp[0] = {0, 0}; for (int i = 0; i <= target; i++) { int presentDart = dp[i].first; int presentSob = dp[i].second; for (int score : scores) { int nextDart = presentDart + 1; int nextSob = presentSob; if (singleOrBool(score)) { nextSob++; } if (dp[i + score].first > nextDart) { dp[i + score] = {nextDart, nextSob}; } else if (dp[i + score].first == nextDart && dp[i + score].second < nextSob) { dp[i + score] = {nextDart, nextSob}; } } } vector<int> answer = {dp[target].first, dp[target].second}; return answer; }
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - [1차] 추석 트래픽 [C++] (0) 2024.03.02 프로그래머스 - 2차원 동전 뒤집기 [C++] (0) 2024.03.01 프로그래머스 - 모두 0으로 만들기 [C++] (0) 2024.03.01 프로그래머스 - 코딩 테스트 공부 [C++] (0) 2024.03.01 프로그래머스 - 교점에 별 만들기 [C++] (0) 2024.02.28