8-B 문제 문의
안녕하세요 선생님,
8-B 문제에 대해 문의드리고 싶습니다.
저는 재귀를 들어갈 때 마다 (스텟이 바뀔 때 마다) 새로 해결한 퀘스트 수를 더하는 식으로 문제를 풀었는데 틀렸습니다. 저는 dp를 풀 때 현재값 + 재귀값으로 풀어왔는데 틀리니 이상합니다.
48번 줄: ret = max(ret, nvisit + go(STR + i, INT + (PNT - i)));
선생님 풀이를 보고, 각 재귀 마다 현재 스텟에서 성공한 횟수를 반환하는 식으로 구현하니 맞게 나옵니다.
47번 줄: ret = max(ret, go(STR + i, INT + (PNT - i)));
선생님 풀이와 로직은 동일한 것 같은데, 어떤 부분에서 틀렸는 지 모르겠습니다.
틀린 풀이
https://www.acmicpc.net/source/share/9878747de0af458ca79dde4f3555903c
맞는 풀이
https://www.acmicpc.net/source/share/e7061d5e24564ad2a773395440381ecc
항상 강의 잘 듣고 있습니다.
감사합니다.
답변 2
0
안녕하세요 JL님 ㅎㅎ
for (i = 0; i < N; i++) {
if (solvable(STR, INT, i)) {
// 방문처리
if(visited[i] == 0) {
visited[i] = 1;
visit.push_back(i);
PNT += PNTs[i];
}
}
}
int nvisit = visit.size();
ret = nvisit;이부분에서 틀린 것 같습니다.
여기서 ret은 이 str, int일 때 처리할 수 있는 퀘스트개수를 의미해야 합니다.
여기서 해결가능하다면 -> ret을 ++를 하고 그 ret을 기점으로 해야하는데 지금 보시면 ret의 초기값이 visited에 맞춰져 있습니다. 저 부분은 해결가능하고 & 전의 str, int 상태로는 안깬 퀘스트를 의미해서 로직 자체가 어긋나게 되는 것 같습니다.
감사합니다.
0
안녕하세요 선생님,
로직에 대해 다시 문의드리고 싶습니다. 저는 제가 작성한 로직과 선생님께서 작성하신 로직이 동일하다고 생각됩니다.
지금 해결한 퀘스트 수 + 다음에 해결할 퀘스트 수 = 다음 스텟으로 해결할 수 있는 퀘스트 수
그래서 저는 방문처리를 이용하여 이전에 해결한 퀘스트를 제외하고, 지금 해결한 퀘스트를 세고 (nvisit), 다음 재귀에서 새로 해결한 퀘스트 (go(STR + i, INT + (PNT - i)))를 더 해주는 방식으로 코드를 구현했습니다.
48번 줄: ret = max(ret, nvisit + go(STR + i, INT + (PNT - i)));
다시 한 번 확인해주시면 감사하겠습니다.
감사합니다.
1
안녕하세요 JL님 ㅎㅎ
그래서 저는 방문처리를 이용하여 이전에 해결한 퀘스트를 제외하고, 지금 해결한 퀘스트를 세고 (nvisit), 다음 재귀에서 새로 해결한 퀘스트 (go(STR + i, INT + (PNT - i)))를 더 해주는 방식으로 코드를 구현했습니다.
>> 근데 이러면 지금의 STR, INT를 기반으로 해결하는 퀘스트 수는 안세게 되지 않을까요?
지금 해결한 -> 이라는 의미가
지금의 STR, INT로 해결할 수 있는 퀘스트 - 이전 타임에서 해결한 퀘스트
가 되는데요.
이렇게 되면 DP의 의미인 STR, INT로 해결할 수 있는 퀘스트 수라는 의미가 깨지지 않나요?
그니까 이 DP의 의미는 매개변수가 STR, INT를 받아 해결할 수 있는 최대의 퀘스트를 반환해야 하는 것
int go(int STR, int INT) {
int i;
int PNT = 0;
int ret;
vector<int> visit;
...
for (i = 0; i < N; i++) {
if (solvable(STR, INT, i)) {그래서 여기서 현재 STR, INT를 기반으로 깰 수 있는 퀘스트수를 구하려면 STR, INT받고 -> 해결가능하다면 -> 카운팅을 한 해당 값을 기반으로 해야 하는 것 아닌가요?
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
재귀 함수를 사용한 문제 해결 방식에서 틀린 점과 맞는 점을 비교해 보았을 때, 기본적으로 재귀함수를 호출하며 스텟이 바뀌고 그 결과를 통해 최대값을 갱신하는 로직은 같습니다. 하지만 틀린 풀이에서는 ret = max(ret, nvisit + go(STR + i, INT + (PNT - i))); 로 되어 있어 재귀 함수를 호출할 때마다 nvisit(새로 해결한 퀘스트 수)를 더하고 있습니다. 이는 현재 상태에서 해결할 수 있는 퀘스트 수를 재귀적으로 더해가며 카운트하는 방식으로 볼 수 있습니다.
반면, 맞는 풀이에서는 ret = max(ret, go(STR + i, INT + (PNT - i)));를 통해 스텟이 바뀔 때마다 새로운 퀘스트 수의 최대값을 직접적으로 비교하기만 합니다. 즉, 각 스텟 변화마다의 성공 횟수만을 반환하여, 그 중 최대값을 찾는 식으로 구현한 것이죠.
틀린 점은 재귀 함수의 호출과정에서 현재값(nvisit)을 더하는 처리를 한 것입니다. 이는 해당 재귀 단계에서 해결할 수 있는 퀘스트 수를 잘못 계산하게 만들 수 있습니다. 문제의 요구사항이나 재귀 함수 호출의 논리에 따라 이런 방식이 오히려 문제의 답을 찾는 데 방해가 될 수 있습니다. 재귀 함수의 기본 원리와 문제의 요구 사항을 정확히 이해하고, 각 단계에서의 반환 값과 그 의미를 명확히 하는 것이 중요합니다.
재귀 함수와 dp를 활용한 문제 해결에서는 각 단계에서 어떤 값을 반환하고, 이를 어떻게 활용할지에 대한 정확한 이해가 필요합니다. 문제의 조건과 목표를 명확히 파악하고, 각 재귀 호출이 의미하는 바를 정확히 이해하면서 문제를 접근해야 합니다.
항상 강의에 집중해주셔서 감사합니다. 앞으로도 코딩 테스트 준비에 도움이 되는 내용을 제공해드리기 위해 노력하겠습니다.
4-F 경우의 수 질문입니다.
0
9
1
코딩살구클럽 가입이 안됩니다.
0
30
0
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
34
1
교안 158페이지 문의드립니다
0
34
2
코딩살구클럽 관련 건의사항
0
84
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
35
1
진행 방법 질문드립니다!
0
70
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
60
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
296
2
백준 서비스 종료
9
909
1
sk 하이닉스 코테 대비
0
375
2
3-G 최댓값 질문
0
52
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
63
2
3-N 질문 있습니다.
0
68
2
학습방법
0
103
2
4-H 질문 있습니다 (코드 리뷰)
0
67
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
176
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
70
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
52
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
69
2
함수별 시간복잡도
0
75
2





