강의

멘토링

로드맵

Inflearn brand logo image

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

김라영님의 프로필 이미지
김라영

작성한 질문수

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

7-C

7-c 코드 질문이 있습니다!

해결된 질문

작성

·

72

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요! 큰돌님 다름이 아니라 해당문제를 잘 못 풀겠어서 큰돌님 풀이를 봤는데요
저는 맨처음에 문제를 풀때 좌표를 벗어나는지와 구멍인지를 for문 안에서 체크했는데요

for(int i = 0; i < 4; i++){
        // 해당 좌표만큼 이동한다
        int ny = y + dy[i] * value;
        int nx = x + dx[i] * value;
        if(!in(y, x) || b[y][x] == 'H') continue;
        ret= max(ret, down(ny, nx) + 1);
    }

이렇게 제출하니까 틀렸다고 떴습니다. 왜 for문 안에 넣으면 안되는 걸까요?

아래는 제출한 전체 코드입니다.

#include <bits/stdc++.h>

using namespace std;
int t,a,d[54][54];
string s; 
char b[54][54];
bool check[54][54];
const int dy[4] = {-1, 0, 1, 0};
const int dx[4] = {0, 1, 0, -1};

// 좌표 내에 포함하는 지 체크한다
bool in(int aa,int bb){
    return(1<=aa && aa<=t && 1<=bb && bb<=a);
}  
int down(int y,int x){
    // 이미 갔던 곳이라면 순회를 하는 코드이니까 -1을 출력하고 main함수 종료
    if(check[y][x]){
        cout << -1 << "\n";
        exit(0);
    } 
    //현재 좌표로 이동한 횟수 -> 이미 해당 위치에 숫자가 있다면 
    int &ret = d[y][x];
    
    if(ret) return ret;
    
    check[y][x] = 1;
    int value = (int)b[y][x] - '0';
    for(int i = 0; i < 4; i++){
        // 해당 좌표만큼 이동한다
        int ny = y + dy[i] * value;
        int nx = x + dx[i] * value;
        // 좌표를 벗어나거나 구멍이면 return 0 -> 갈 수 없음
        if(!in(y, x) || b[y][x] == 'H') continue;
        ret= max(ret, down(ny, nx) + 1);
    }
    // 원복을 해준다
    check[y][x] = 0;
    return ret;
}
int main(){
    cin >> t >> a;
    for(int i = 1; i <= t; i++){
        cin >> s;  
        for(int j = 1; j <= a; j++){
            b[i][j] = s[j - 1];
        }
    }
    cout << down(1, 1) << "\n";
}

답변 2

0

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

안녕하세요 라영님 ㅎㅎ

만약에

    for(int i = 0; i < 4; i++){
        // 해당 좌표만큼 이동한다
        int ny = y + dy[i] * value;
        int nx = x + dx[i] * value;
        // 좌표를 벗어나거나 구멍이면 return 0 -> 갈 수 없음
        if(!in(y, x) || b[y][x] == 'H') continue;
        ret= max(ret, down(ny, nx) + 1);
    }

이 for문이 만족이 다 안되서 ret 이 0으로 수렴했다고 가정을 해보면 저기서 return 0을 하게 됩니다.

내가 지금 a라는 정점에 왔기 때문에 무조건 +1이 되어야 하는데 0을 리턴하기 때문에 틀리게 됩니다. 이렇게 ny, nx를 기반으로 한다면 해당 부분에 맞춰서 ret의 초기값을 1로 조정해주어야 합니다.


        if(!in(y, x) || b[y][x] == 'H') continue;

또한, 앞의 코드는 ny, nx가 되어야 할 것 같습니다.


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

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

김라영님, 질문 주셔서 감사합니다. 작성해주신 코드에서 문제가 되는 부분에 대해 설명드리겠습니다.

문제 확인

코드에서 말씀하신 in(y, x), b[y][x] == 'H' 조건문의 위치가 문제 발생의 원인입니다. 이를 통해 좌표의 범위를 벗어나는지, 구멍에 해당하는지를 확인하는데, 계산의 부정확성 혹은 논리의 잘못된 연쇄가 발생할 수 있습니다.

문제 원인

  1. 좌표 범위 및 구멍 확인: in(ny, nx)b[ny][nx] == 'H'로 변경해야 합니다. 새로운 위치 ny, nx를 탐색해야 하는데, 주어진 코드에서는 y, x를 사용하고 있었습니다. 이는 탐색 범위를 잘못 검증하여 결과에 오류를 발생시킬 수 있습니다.

  2. 논리적 순서: continue 문을 통해 새로운 위치로 이동 가능한지를 검증한 뒤, 실제로 탐색을 진행해야 합니다. 즉, 좌표 검사 및 상태 검사를 먼저 수행하여야 하는데 초기 작성한 코드에서는 순서적으로 위치가 맞지 않았습니다.

해결 방법

아래와 같이 조건문을 수정하여 문제를 해결할 수 있습니다:

for(int i = 0; i < 4; i++){
    // 해당 좌표만큼 이동한다
    int ny = y + dy[i] * value;
    int nx = x + dx[i] * value;
    // 좌표를 벗어나거나 구멍이면 continue
    if(!in(ny, nx) || b[ny][nx] == 'H') continue;
    ret = max(ret, down(ny, nx) + 1);
}

이렇게 조건문을 수정하면 탐색할 새로운 좌표의 범위와 상태를 올바르게 확인하여 최대 가능 이동 횟수를 계산할 수 있습니다.

이해를 돕기 위해 관련 내용을 참고할 수 있는 질문 예시: “7-c 코드 질문입니다”.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김라영님의 프로필 이미지
김라영

작성한 질문수

질문하기