해결된 질문
작성
·
29
0
안녕하세요!
강의를 보고 혼자서 풀었는데 조금식 다르기는 하지만 전체적인 흐름은 큰돌님 코드와 똑같다고 생각합니다.
하지만 왜인지 자꾸 틀렸다고 뜨네용..
#include <bits/stdc++.h>
using namespace std;
int n, k;
queue<int> q;
int visited[200004];
int arr[200004];
int t;
int ret;
int main() {
cin >> n >> k;
if (n == k) {
cout << 0 << "\n" << 1;
return 0;
}
q.push(n);
visited[n] = 1;
arr[n] = -1;
while (q.size()) {
t = q.front();
q.pop();
if (t == k) {
break;
}
for (int next : {t - 1, t + 1, t * 2}) {
if (next < 0 || next > 100000) continue;
if (visited[next]) continue;
visited[next] = visited[t] + 1;
arr[next] = t;
q.push(next);
}
}
int temp = k;
vector<int> v;
while (temp != -1)
{
v.push_back(temp);
temp = arr[temp];
}
reverse(v.begin(), v.end());
cout << visited[k] -1 << "\n";
for (int a : v) {
cout << a << " ";
}
}
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
16wjdekdms님께서 공유해 주신 코드에 대한 오류를 찾는 것은 문제가 주어지지 않은 상태에서 해결하기 어려울 수 있지만, 일반적으로 발생할 수 있는 몇 가지 오류를 짚어 드리겠습니다.
visited 배열의 범위 문제:
현재 visited
배열은 200004로 설정되어 있지만, 문제에서는 최대 범위를 100000으로 설정했기 때문에 불필요하게 크다고 볼 수 있습니다. 더 안전하게 둔 것으로 이해할 수 있지만, 코드를 작성하고 디버깅하는 데 혼란을 줄 수 있습니다. 사용되지 않는 부분을 최적화하는 것도 하나의 방법입니다.
while문 내 반복 조건:
while (q.size())
안에서 t == k
일 때만 반복을 끝내는데, break
이후 추가적인 조건이나 로직을 확인하지 않는다는 점을 유념하여 확인하십시오. 그 근처에 있는 break;
문이 로직 상 적절하게 위치했는지 한번 더 점검해 보십시오. 예를 들어 같은 거리에 존재하는 더 여러 경로가 있을 수 있는데, 현재 구문으로는 첫 번째로 찾은 경로가 곧바로 사용됩니다.
반례 검사:
초기 본 코드는 계획된 작동을 확인했지만 테스트 케이스가 안 맞다면 범위 내 극단적인 값이나 조건(n
과 k
가 아주 클 때 등) 등 다양한 케이스를 시도해 보고 코드를 조금씩 디버깅하며 조정하는 것이 필요합니다.
출력형식 및 제출 조건 확인:
혹시 오류가 난 부분이 코드 로직이 아닌, 출력 형식이나 제출 조건에서 비롯된 것은 아닌지도 다시 한번 확인해보세요.
코드 흐름 리뷰:
C++ 코드 특성 상 배열이나, 큐의 자료구조 오류 등이 보일 수 있습니다. 각 함수를 디버깅 도구로 하나하나 추적하며 코드 흐름을 분석해보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.