• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

잃어버린 강아지 문제 count 관련 질문있습니다

24.03.13 17:50 작성 24.03.13 17:51 수정 조회수 76

0

안녕하세요 강사님 강의 잘 듣고 있습니다!

잃어버린 강아지 문제에서 count관련 이해가 안되는 부분이 있어서요. 관련 부분만 가져왔는데 count는 처음에 0으로 초기화 된 상태에서 while문에 들어가자마자 1이 증가하고, 마지막으로 들어갈 때는 9999상태에서 들어가서 10000이 되고, 그시점에 마지막 번째 while을 실행하면서 현수가 강아지를 찾아서 x1 == x2 && y1 == y2이 된 후 break(사실상 while문이 끝나서 break된거나 마찬가지지만)될수도 있는건데 강아지를 못찾고 반환하는 0을 리턴하는 조건이 count >= 10000이 되면 10000번째에 찾더라도 못찾은걸로 표현될수 있지 않나 싶어서요.

그런데 이런 생각을 하다보니까 그러면 진짜로 10000을 넘을때까지 못찾는 경우는 어떻게 알수 있게 되지? 라는 생각이 들면서 정리가 안되기 시작했습니다. ㅠㅠ count가 while안에 있기 때문에 10000번째에 딱 찾고 끝나고 나면 더이상 count를 올려줄 방법이 없는데, 어떻게 해야 만번 이상을 했고 그래도 찾을수 없었던걸 증명할수 있을지...

일단 생각으로는 while을 true로 해놓고 break하는 조건을 하나 더 둬서 if(x1 == x2 && y1 == y2) break; 아래에 if(count == 10000) break;나 if(count >= 10000) break; 이렇게 하는 방법이 떠오르긴 하는데 이렇게 해도 괜찮을지, 강사님이 해주신 코드로 충분한데 제가 이해를 못하고 있는것일지.. 설명 늘 자세히 해주시는데도 질문해서 죄송합니다🥲 항상 감사합니다

int d1 = 0, d2 = 0, count = 0;
while (count < 10000) {
    count++;
    int nx1 = x1 + dx[d1];
    int ny1 = y1 + dy[d1];
    int nx2 = x2 + dx[d2];
    int ny2 = y2 + dy[d2];
    boolean flag1 = true, flag2 = true;
    if (nx1 < 0 || nx1 >= n || ny1 < 0 || ny1 >= n || board[nx1][ny1] == 1){
        d1 = (d1 + 1) % 4;
        flag1 = false;
    }
    if (nx2 < 0 || nx2 >= n || ny2 < 0 || ny2 >= n || board[nx2][ny2] == 1){
        d2 = (d2 + 1) % 4;
        flag2 = false;
    }
    if(flag1 == true){
        x1 = nx1;
        y1 = ny1;
    }
    if(flag2 == true){
        x2 = nx2;
        y2 = ny2;
    }
    if(x1 == x2 && y1 == y2) break;
}
if (count >= 10000) return 0;

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.15

안녕하세요, 인프런 AI 인턴입니다.

코드에서 count가 10000회를 넘어가는 경우에는 더 이상 강아지를 찾을 수 없다고 판단하여 0을 반환하는 로직을 작성하셨군요. 매우 중요한 포인트를 짚으신 것 같습니다. 김진하님께서 거론하신 문제를 해결하는 한 가지 방법은 while 문 내에서 강아지를 찾았을 때 바로 반환 값을 지정하는 것입니다. 즉, 강아지를 찾았을 때는 break; 대신 바로 return문을 통해 결과를 반환하면, 10000번째에서 강아지를 찾았는지 못 찾았는지 정확히 구분할 수 있습니다.

이에 따른 코드의 수정 예시는 다음과 같습니다.

//...
while (count < 10000) {
    count++;
    // ... (여기서는 이전 코드를 동일하게 사용)
    if(x1 == x2 && y1 == y2) return 1; // 강아지를 찾았을 때 성공을 의미하는 1을 반환
}
return 0; // 10000번 시도했음에도 강아지를 못 찾은 경우

이렇게 하면 while문 내에서 강아지를 찾은 경우 즉시 성공을 반환하고, 반복문이 모두 실행된 후에는 실패를 반환하여, 정확하게 강아지를 찾았는지 못 찾았는지를 구분할 수 있습니다. 게다가 break문 없이 코드를 더 간결하게 만들 수 있습니다.

이런 접근 방법이 김진하님의 문제를 해결하는 데 도움이 되었기를 바랍니다. 혼란스러웠던 부분이 잘 정리되었길 바랍니다. 프로그래밍 공부에 항상 화이팅하세요!