8-B 문제 질문
233
작성한 질문수 28
안녕하세요 큰돌선생님 매번 좋은 강의 감사합니다..
문제를 풀다가 못풀어서 선생님 코드를 보고 강의를 시청하였는데요, rpg함수는 dp배열을 갱신하는 재귀함수인데 기저사례가 없는 이유가 궁금합니다. 아직 제가 코드를 완전히 이해하지 못하는것 같은데, 제 생각으로는 선생님코드
for(int p = 0; p <= pnt; p++){
int nextSTR = min(1000, STR + p);
int nextINT = min(1000, INT + pnt - p);
ret = max(ret, rpg(nextSTR, nextINT));
}이 부분에서 pnt가 0이더라도 계속 rpg() 함수를 호출할것 같은데 제가 어느부분을 이해하지 못하는 건가요??
답변 2
1
안녕하세요 명운님 ㅎㅎ
이게 좀 특이한 문제인데 어차피 0 ~ 1000 까지의 int, str 부분만을 탐색한다.
즉 무한히 탐색하는것이 아니라 특정 범위만을 탐색하기 때문에 무한히 idx가 증가했을 때 그걸 처리하는 기저사례가 없어도 된다라고 보시면 됩니다.
for(int p = 0; p <= pnt; p++){
int nextSTR = min(1000, STR + p);
int nextINT = min(1000, INT + pnt - p);
ret = max(ret, rpg(nextSTR, nextINT));
}이 코드를 보시면 일단 0 ~ 1000까지의 str, int 마다 함수가 호출될 것이라는것이 보이죠?
자 여기서
int rpg(int STR, int INT){
int &ret = dp[STR][INT];
if(ret != -1) return ret;
이렇게 이전에 방문했던 정점. 계산되었던 정점이라면 그냥 return 하는 것을 알 수가 있습니다.
이 부분에서 pnt가 0이더라도 계속 rpg() 함수를 호출할것 같은데
>>
아닙니다. pnt 가 모두 0일때를 가정하면 1, 1인 상태에서 해당 함수가 종료되어 더이상 함수호출은 일어나지 않습니다.
디버깅코드를 좀 넣어봤는데요. 이렇게 한번 해보시면 확인하실 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
struct game{
int x, y, c;
};
vector<game> a;
int n, dp[1001][1001];
bool visited[101];
int rpg(int STR, int INT){
cout << STR << " : " << INT << "\n";
int &ret = dp[STR][INT];
if(ret != -1) return ret;
ret = 0;
int pnt = 0;
vector<int> v;
for(int i = 0; i < n; i++){
if(a[i].x <= STR || a[i].y <= INT){
ret++;
if(!visited[i]){
visited[i] = true;
pnt += a[i].c;
v.push_back(i);
}
}
}
for(int p = 0; p <= pnt; p++){
int nextSTR = min(1000, STR + p);
int nextINT = min(1000, INT + pnt - p);
ret = max(ret, rpg(nextSTR, nextINT));
}
for(int here : v)
visited[here] = false;
return ret;
}
int main(){
scanf("%d", &n);
for(int i=0; i<n; i++){
int STR, INT, PNT;
scanf("%d %d %d", &STR, &INT, &PNT);
a.push_back({STR, INT, PNT});
}
memset(dp, -1, sizeof(dp));
printf("%d\n", rpg(1, 1));
}
TC
5
1 1 0
3 1 0
1 3 0
10 20 0
3 3 0
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요 이명운 님, 인프런 AI 인턴이에요. 질문 주셔서 감사합니다.
선생님 코드를 보면, rpg() 함수가 재귀적으로 호출되는 부분에서 pnt가 0인 경우에는 p값에 따라서 STR과 INT를 갱신하는 것을 볼 수 있습니다. 따라서 pnt가 0일 때는 p 값이 0 일 때 한 번 호출되고 종료되게 됩니다.
이렇게 되는 이유는 for문의 조건에서 p는 0부터 pnt까지 반복되기 때문입니다. pnt가 0일 때는 p값도 0이기 때문에 반복문이 한 번만 실행되고 종료되게 됩니다.
따라서 rpg() 함수는 기저 사례가 있는 재귀 함수로서, pnt가 0인 경우에도 한 번 호출되고 종료되게 됩니다.
선생님의 코드를 참고하여 문제를 푸는데 이해가 어려운 부분이 있다면, 해당 부분을 선생님께 질문하여 더 자세한 설명을 받으시는 것을 추천드립니다. 감사합니다!
4 - A
0
10
1
코딩살구클럽 입장이 안됩니다
0
52
2
4-F 경우의 수 질문입니다.
0
30
2
코딩살구클럽 가입이 안됩니다.
0
64
2
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
54
1
교안 158페이지 문의드립니다
0
44
2
코딩살구클럽 관련 건의사항
0
108
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
44
1
진행 방법 질문드립니다!
0
79
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
63
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
309
2
백준 서비스 종료
9
943
1
sk 하이닉스 코테 대비
0
382
2
3-G 최댓값 질문
0
54
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
63
2
3-N 질문 있습니다.
0
68
2
학습방법
0
105
2
4-H 질문 있습니다 (코드 리뷰)
0
68
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
180
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
71
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
53
2





