https://www.acmicpc.net/problem/1697
백준 1697번 BFS 문제입니다. (문제풀이 해달라는 질문이 아닙니다!!)
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
vector<bool> visited(100001, false);
vector<int> num(100001, 0);
queue<int> q;
q.push(n);
visited[n] = true;
while(true){
int x = q.front();
q.pop();
for (int i=0; i<3; i++){
int c;
if (i == 0){
if (x - 1 >= 0) c = x - 1;
else continue;
}
else if (i == 1){
if (x + 1 <= 100000) c = x + 1;
else continue;
}
else if (i == 2) {
if (x * 2 >= 0 && x * 2 <= 100000) c = x * 2;
else continue;
}
if (c == k){
cout << num[x] + 1;
return 0;
}
else if (!visited[c]){
q.push(c);
visited[c] = true;
num[c] = num[x] + 1;
}
}
}
}
위의 코드가 제가 짠 코드인데, 몇가지 예시들 다 넣어봤는데 모두 잘 나와서
제출하니까 틀렸다고 나오는거에요
그래서 한참을 삽질하다가 백준 질문 게시판에서 반례 하나 찾았는데 그게 뭐냐면
n = 100000, k = 100000 입니다.
n과 k가 같을 때는 0이 나와야 하는데 제 코드는 2가 나오더라구요.
if (n == k){
cout << 0;
return 0;
}
중간에 위 코드 넣어주고 제출하니까 바로 통과됐습니다.
여기서 고민은... 저는 저런 특수케이스?를 고려해야 한다는 생각이 눈꼽만큼도 안들었고
완벽한데 왜 안되지? 이생각만 계속 했어요.
몇시간 낭비하다가 저 반례 보고 머리가 띵 했습니다... "완전 내 예상 밖이다, 나는 재능이 없는게 아닐까?" 하구요 ㅠㅠ
만약에 이게 코딩테스트였으면 생각만해도 끔찍해요
앞으로 더 많은 문제들을 풀건데 계속 이럴까봐 너무 막막합니다... 조언 부탁드려요
특수 코너케이스는 투어리스트도 가끔 놓칩니다. 저런거 찾는거는 재능의 영역은 아님
ㄹㅇ 저런건 경험에 더 많이 의존하는듯
감사합니다 열심히할게요
개발할 때도 이런 케이스가 있었다고? 하면서 버그 생기는 일 일상이니까 경험 많이 해보고 익숙해지세요
감사합니다
근데 이건 코딩을 안일하게 해서 나오는 실수임. visited 배열의 상태가 시작점도 0이고 미방문점도 0이라서 시작점을 처음에 방문하지 않았다고 생각하고 한 칸 들렀다가 방문해서 2가 되는 거잖아. 이런건 논리가 잘못된 거고, 미방문점을 전부 -1로 초기화하거나, 시작점을 1로 시작한 다음에 마지막에 1을 빼주는 등의 방법으로 우회가 가능함.
다시 보니 방문 직전에 이전점 거리 + 1을 더하는거네.. 그래도 틀린 이유 자체는 매우 비슷한 듯. 내가 위에서 말한 배열은 visited 배열이 아니라 num 배열이고. 그러면 처음에 visited[n] = true, num[n] = 0으로 주고 while 조건을 visited[k] != 0 으로 주고 하면 될 듯.
그렇네요 지금은 코드를 완전히 뜯어고쳐서 잘 되네요.. 감사합니다
지금보니까 저 코드는 최소시간만 구할 수 있고 경우의 수 같은건 구하기가 힘드네요;; 여러모로 완성도가 떨어지는 코드였네요 ㅠ