해결된 질문
작성
·
42
1
// 아래 풀이법에서 제시해주신 풀이법과 비슷하게 풀이한 것 같으나 백준에서는 자꾸 45% 쯤에서 오답처리가 됩니다 ㅜㅜ... 제 알고리즘에 어떤 문제가 있는 걸까요...
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> R;
vector<int> G;
vector<int> B;
int dp[1001][3];
void Input()
{
cin >> N;
for(int i = 0; i < N; i++)
{
int r, g, b;
cin >> r >> g >> b;
R.push_back(r);
G.push_back(g);
B.push_back(b);
}
}
void DP()
{
dp[0][0] = R[0];
dp[0][1] = G[0];
dp[0][2] = B[0];
for (int idx = 1; idx < N; idx++)
{
for (int rgb = 0; rgb < 3; rgb++)
{
if (rgb == 0)
{
dp[idx][rgb] = min(dp[idx - 1][1], dp[idx - 1][2]) + R[idx];
}
else if (rgb == 1)
{
dp[idx][rgb] = min(dp[idx - 1][0], dp[idx - 1][2]) + G[idx];
}
else if (rgb == 2)
{
dp[idx][rgb] = min(dp[idx - 1][0], dp[idx - 1][1]) + B[idx];
}
}
}
int minVal = INT16_MAX;
for (int i = 0; i < 3; i++)
{
if (dp[N - 1][i] < minVal)
{
minVal = dp[N - 1][i];
}
}
cout << minVal << endl;
}
void Solve()
{
DP();
}
int main()
{
Input();
Solve();
}
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
남경태님, RGB 색칠하기
문제에 대해 질문해주셨네요. 코드 확인을 통해 몇 가지 점검할 사항을 언급해드리겠습니다:
초기값 설정: dp[0][0]
, dp[0][1]
, dp[0][2]
가 적절하게 초기화되어 있는지 확인해 보세요. 현재 코드에서는 R
, G
, B
백터의 첫 번째 값으로 초기화하고 있어서 문제는 없어 보입니다.
범위 확인: for (int idx = 1; idx < N; idx++)
로 루프를 돌리고 dp[idx - 1][...]
를 참조하고 있기 때문에 인덱스 범위를 벗어나지 않도록 항상 주의해야 합니다. N이 충분히 크다면 이 부분이 문제가 되지는 않을 것입니다.
출력 문제: 출력 시, 결과 값이 INT16_MAX
로 초기화되어 있어 최솟값 결정 시 이보다 작은 값이 되는 방향으로 진행이 되고 있다면 논리상 큰 문제는 없어 보입니다.
입력과 출력: 입출력 관련해서 C++에서는 scanf
/printf
등이 cin
/cout
보다 실행 속도가 빠르므로 시간 제한에 걸릴 경우 입출력 방식을 변경하는 것도 고려해보세요.
혹 이 외에 문제 사례가 발생하는 경우 일부 특이한 입력 케이스에서 예외 상황이 발생할 수 있습니다. 예를 들어, 특정 N 값이나 각 R, G, B 값이 극단적인 경우에 대해 추가적인 테스트 케이스를 만들어 테스트해보시길 권장합니다.
추가적인 문제가 발생하거나 해결되지 않을 경우, 보다 세부적인 디버깅
을 통해 문제를 확인할 필요가 있을 수 있습니다.
편의상, 이 자료에 명시된 ‘문의하기’를 통해 인프런 커뮤니티의 강사님께 직접 질문할 수 있으니, 필요 시 이용해보세요.
감사합니다.