인프런 커뮤니티 질문&답변
연구소 문제 런타임 에러
작성
·
245
0
안녕하세요,
강의 재미있게 잘 듣고 있습니다 ㅎㅎ
http://boj.kr/fe9681a5260641dd90842b66b46cf5ec
기본 로직은 같은 것 같아서 크게 코드 위치를 수정을 하지 않았는데, 로컬에서 돌리면 아무 결과 출력이 안되고, 백준에 제출하니 never be null 런타임 에러가 발생하였습니다.
어떤 부분이 문제일까요?
감사합니다: ) 즐거운 추석되세요
답변 2
1
큰돌
지식공유자
ddo님이 잘 설명해주셨는데요.
첨언해서 올립니다. 주석 달았습니다.
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<cstring>
#include<tuple>
using namespace std;
int n, m, mm[10][10], visited[10][10], currentCnt, maxCnt=0;
vector<pair<int,int>> emty;
const int dx[4] = {1,0,-1,-0};
const int dy[4] = {0,1,0,-1};
// 1. y, x로 받고 x, y로 하면 헷갈립니다. 해당 부분은 수정하시는게 좋을 것같아요. 이러한 헷갈림은
// 틀린 코드로 이어집니다.
// 2. nx >= m ???
// 3. memcpy(visited, 0, sizeof(visited)); ????
void dfs(int x, int y){
//왜 여기선 갑자기 x, y? nx가 n을 비교해서 괜찮긴 함 근데..
visited[x][y] = 1;
for(int i=0; i<4; i++){
int nx = dx[i]+x;
int ny = dy[i]+y;
//nx >= m???? 이부분이 문제가 있는 것같아요.
if(nx<0||nx>=n||ny<0||nx>=m||visited[nx][ny]||mm[nx][ny]==1) continue;
if(mm[nx][ny]==0) mm[nx][ny] = 2;
}
}
void virusTest(){
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(mm[i][j]==2)
dfs(i,j);
for(int i =0; i<n; i++)
for(int j=0; j<m; j++)
if(!visited[i][j]&&mm[i][j]==0) currentCnt++;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
//입력은 y, x로
for(int i=0; i<n; i++)
for(int j=0; j<m; j++){
cin >> mm[i][j];
if(mm[i][j]==0) emty.push_back({i,j});
}
cout<<emty.size()<<endl;
int size = emty.size();
for(int i=0; i<size; i++)
for(int j=i+1; j<size; j++)
for(int k=j+1; k<size; k++){
//initialization
// ????
currentCnt = 0;
memcpy(visited, 0, sizeof(visited));
//make temporal wall
mm[emty[i].first][emty[i].second] = 1;
mm[emty[j].first][emty[j].second] = 1;
mm[emty[k].first][emty[k].second] = 1;
//and test the effect
virusTest();
maxCnt = max(maxCnt, currentCnt);
//turn it back to normal
mm[emty[i].first][emty[i].second] = 0;
mm[emty[j].first][emty[j].second] = 0;
mm[emty[k].first][emty[k].second] = 0;
}
cout<<maxCnt;
return 0;
}
감사합니다.
1
도움 드릴려고 코드를 제 컴퓨터에서도 돌려봤는데 48라인 앞과 뒤에 군데군데 cout을 찍어봤지만 출력이 안되고 terminated with exit code: 1 로 종료되더라고요.
(입출력씽크 코드를 제거하니 cout 코드가 보여집니다)
보니까 55번라인에서 memcpy는 똑같은 모양의 배열을 복사할 때 사용하는 상황에서 써야하는데 그렇지 않기 떄문에 오류가 발생한 것 같습니다.
memset으로 memset(visited, 0, sizeof(visited)); 고쳐주시면 잘 흘러가네요
터미널 실행결과에 에러위치를 알려주지 않으니 찾는데 오래걸렸습니다
그치만 다음부터 이런 상황이 오면 함수를 제대로 사용했는지 살펴볼 수 있는 계기가 된것같네요ㅎㅎ






감사합니다 ㅠㅠㅠ 많은 도움이 되었습니다!!!!