해결된 질문
작성
·
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'
조건문의 위치가 문제 발생의 원인입니다. 이를 통해 좌표의 범위를 벗어나는지, 구멍에 해당하는지를 확인하는데, 계산의 부정확성 혹은 논리의 잘못된 연쇄가 발생할 수 있습니다.
좌표 범위 및 구멍 확인: in(ny, nx)
와 b[ny][nx] == 'H'
로 변경해야 합니다. 새로운 위치 ny
, nx
를 탐색해야 하는데, 주어진 코드에서는 y
, x
를 사용하고 있었습니다. 이는 탐색 범위를 잘못 검증하여 결과에 오류를 발생시킬 수 있습니다.
논리적 순서: 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 코드 질문입니다”.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.