Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 윈도우
- 자료구조 목차
- 탄막 이동
- 수 만들기
- 걷는건귀찮아
- 토글 그룹
- 문자열 압축
- AI Hub
- 2020 KAKAO BLIND RECRUITMENT
- 마우스 따라다니기
- 3273
- 알고리즘 목차
- 18249
- 탄막
- mysqld.sock
- MySQL
- 영상 프레임 추출
- 유니티
- 회의실 배정
- 그리디알고리즘
- 원형
- 탄막 스킬 범위
- 단어 수학
- 알고리즘
- 우분투
- c#
- 백준
- 강의실2
- 3344
- SWEA
Archives
- Today
- Total
와이유스토리
[그래프(다익스트라), DP] 프로그래머스 코딩 테스트 공부 C++ 본문
https://school.programmers.co.kr/learn/courses/30/lessons/118668
다익스트라
#include <string>
#include <vector>
#include <queue>
#define INF 10001
using namespace std;
int solution(int alp, int cop, vector<vector<int>> problems) {
int dist[151][151];
fill(&dist[0][0], &dist[150][151], INF);
problems.push_back({0,0,1,0,1}); // 공부 추가
problems.push_back({0,0,0,1,1});
int goal_alp = 0, goal_cop = 0;
for(auto p : problems) {
goal_alp = max(goal_alp, p[0]);
goal_cop = max(goal_cop, p[1]);
}
priority_queue<vector<int>, vector<vector<int>>, greater<>> pq; // 오름차순
pq.push({0, alp, cop});
dist[alp][cop] = 0;
while(!pq.empty()) {
auto now = pq.top();
pq.pop();
if (dist[now[1]][now[2]] < now[0]) continue;
for(auto p : problems) {
if ((now[1] < p[0]) || (now[2] < p[1])) continue; // 못 푸는 문제
int next_alp = min(now[1]+p[2], goal_alp);
int next_cop = min(now[2]+p[3], goal_cop);
if (dist[next_alp][next_cop] <= dist[now[1]][now[2]] + p[4]) continue; // = 없으면 효율성 통과X
dist[next_alp][next_cop] = dist[now[1]][now[2]] + p[4];
pq.push({dist[next_alp][next_cop], next_alp, next_cop});
}
}
return dist[goal_alp][goal_cop];
}
DP
Bottom-Up
#include <string>
#include <vector>
#define INF 10001
using namespace std;
int solution(int alp, int cop, vector<vector<int>> problems) {
int dp[151][151]; // dp[alp][cop] := 최소 공부 시간
fill(&dp[0][0], &dp[150][151], INF);
int goal_alp = 0, goal_cop = 0;
for(auto p : problems) {
goal_alp = max(goal_alp, p[0]);
goal_cop = max(goal_cop, p[1]);
}
alp = min(alp, goal_alp); // 4, 7, 8, 10 TC
cop = min(cop, goal_cop);
dp[alp][cop] = 0;
for(int i=alp; i<=goal_alp; i++) {
for(int j=cop; j<=goal_cop; j++) {
if (i < goal_alp) dp[i+1][j] = min(dp[i+1][j], dp[i][j]+1);
if (j < goal_cop) dp[i][j+1] = min(dp[i][j+1], dp[i][j]+1);
for(auto p : problems) {
if ((p[0] <= i) && (p[1] <= j)) {
int next_alp = min(i+p[2], goal_alp);
int next_cop = min(j+p[3], goal_cop);
dp[next_alp][next_cop] = min(dp[next_alp][next_cop], dp[i][j]+p[4]);
}
}
}
}
return dp[goal_alp][goal_cop];
}
Top-Down
시간 초과
#include <string>
#include <vector>
#include <cstring>
#define INF 10001
using namespace std;
int goal_alp = 0;
int goal_cop = 0;
int dp[151][151];
int func(int alp, int cop, vector<vector<int>>& problems) {
if (goal_alp <= alp && goal_cop <= cop) return 0;
int& result = dp[alp][cop];
if (result != -1) return result;
result = INF;
result = min(result, func(min(goal_alp, alp + 1), cop, problems) + 1);
result = min(result, func(alp, min(goal_cop, cop + 1), problems) + 1);
for (auto p : problems) {
if (alp < p[0] || cop < p[1]) continue;
result = min(result, func(min(goal_alp, alp+p[2]), min(goal_cop, cop+p[3]), problems) + p[4]);
}
return result;
}
int solution(int alp, int cop, vector<vector<int>> problems) {
memset(dp, -1, sizeof(dp));
for (auto p : problems) {
goal_alp = max(goal_alp, p[0]);
goal_cop = max(goal_cop, p[1]);
}
return func(alp, cop, problems);
}
'코딩테스트 > 그래프|트리' 카테고리의 다른 글
[DFS+BFS+DP, BFS] 프로그래머스 카드 짝 맞추기 C++ (0) | 2023.02.24 |
---|---|
[그래프(다익스트라), DFS+DP] (CHECK) 프로그래머스 경주로 건설 C++ (0) | 2023.02.21 |
[그래프(다익스트라)] 프로그래머스 등산코스 정하기 C++ (0) | 2023.02.12 |
[DFS 순열, 그래프, 비트] 프로그래머스 양과 늑대 C++ (0) | 2023.02.11 |
[DFS 순열] 프로그래머스 양궁대회 C++ (0) | 2023.01.21 |
Comments