인프런 커뮤니티 질문&답변

RokiePlayer님의 프로필 이미지
RokiePlayer

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

13913_숨바꼭질4

작성

·

212

0

제가 2일 동안 고민해봤고 선생님의 논리와 같은 거 같은데 왜 안 풀리는지 모르겠습니다.

숨바꼭질2에서는 답이 잘 나와서 확인 해봤는데 

(방금 고민하면서 문제 풀어버렸습니다. 그렇지만 질문은 있습니다.)

//cout << s <<" "; 이거 있는 부분을 해제하고 실행하면 괴상한 수를 잔뜩 거쳐서 목적지로 가더라고요.

이거 제 머리속에 있는 bfs 논리로는 괴상한 수들을 거칠 이유가 없습니다.

 

우선 dfs를 이용해서 경로 추적할 수 있을 거 같은데 그 방향은 안 되는 건가요?

 

 

#include<bits/stdc++.h>

using namespace std;

#define INF 987654321

int n, k, ret = INF, cnt;

const int jump[] = {-1, 1, INF};

int visited[100004];

int parent[100004];

void printPath(int i){

if(parent[i] == -1){

return;

}

printPath(parent[i]);

cout << i << " ";

}

 

 

void bfs1D(int s){

visited[s] = 1;

queue<int> q;

q.push(s);

int ns =-1;

parent[s] = -1;

while(!q.empty()){

int here = q.front(); q.pop();

//cout << s << " ";

if(here==k){

cnt++;

ret = visited[here]-1;

break;

}

for(int i=0;i<3;i++){

if(i==2){

ns = 2*here;

}else{

ns = here + jump[i];

}

if(ns <0 || ns >100000) continue;

if(visited[ns]==0){

visited[ns] = visited[here]+1;

q.push(ns);

parent[ns] = here;

}

}

}

cout << ret << '\n';

cout << s << " ";

printPath(k);

}

 

 

int main(){

ios_base::sync_with_stdio(false);

cin.tie(0); cout.tie(0);

cin >> n >>k;

bfs1D(n);

 

}

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. RokiePlayer님 ㅎㅎ 

 

1. //cout << s <<" "; 이거 있는 부분을 해제하고 실행하면 괴상한 수를 잔뜩 거쳐서 목적지로 가더라고요.

 

이거 제 머리속에 있는 bfs 논리로는 괴상한 수들을 거칠 이유가 없습니다.

 >> 이거 디버깅이 잘못되었습니다.  아래 코드 처럼 디버깅하셔야 합니다. 

 

 while(!q.empty()){

 

 int here = q.front(); q.pop();

 

 cout << here << " ";

 

즉, s가 아니라 here을 중심으로 디버깅하셔야 합니다. :)

 

5 17

5 4 6 10 3 8 7 12 9 11 20 2 16 14 13 24 18 22 19 21 40 1 15 17 4

5 4 8 16 17

 

위 코드를 돌리면 이렇게 나오는데 이는 괴상한 수는 아니죠?  

 

2. 우선 dfs를 이용해서 경로 추적할 수 있을 거 같은데 그 방향은 안 되는 건가요?

 >> dfs도 가능합니다. 잘 짜셨어요. trace할 때는 항상 dfs로 하던가 아니면 for 루프 사용해서 하던가 해야 합니다. :)

 

또 질문사항있으시면 언제든 말씀 부탁드립니다. 

감사합니다. 

강사 큰돌 올림. 

RokiePlayer님의 프로필 이미지
RokiePlayer

작성한 질문수

질문하기