7-c 코드 질문이 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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 코드 질문입니다”.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
DP 경우의 수 설명이 이해가 되지 않습니다.
0
8
1
3-F 채점 관련 질문
0
15
1
BFS, DFS 활용이 되는 상황에서의 방향성
0
20
2
코딩살구클럽 승인
0
25
2
코딩살구클럽승인
0
22
3
코딩살구클럽 승인
0
43
2
3-D 관련 질문
0
33
2
코살구 회원가입 문의
0
40
2
코살구 로그인 문제
0
61
2
3-A 문제 풀이 관련 질문
0
52
3
2-O 질문 있습니다
0
38
2
2-T 문제에 관한 질문
0
39
2
코딩 살구 클럽 접속 및 사용방법 문의
0
59
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
64
2
코딩살구클럽 로그인문제
0
75
3
코딩 살구 클럽 로그인 문제
0
79
2
2-J 채점관련 질문
0
65
3
코딩 살구 클럽 Python 지원 가능 여부
0
77
1
살구클럽 아이디 없음 문제
0
76
1
1-O 코딩살구클럽 채점관련 질문
0
60
2
히든 테스트 케이스가 사라졌습니다
0
57
1
채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요
1
74
2
살구 클럽 채점 관련 문의(테스트 케이스)
0
66
2
1-H 문제 채점하기 오류
0
58
3





