강의

멘토링

커뮤니티

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

김지수님의 프로필 이미지
김지수

작성한 질문수

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

연구소 문제 런타임 에러

작성

·

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)); 고쳐주시면 잘 흘러가네요

터미널 실행결과에 에러위치를 알려주지 않으니 찾는데 오래걸렸습니다

그치만 다음부터 이런 상황이 오면 함수를 제대로 사용했는지 살펴볼 수 있는 계기가 된것같네요ㅎㅎ

김지수님의 프로필 이미지
김지수

작성한 질문수

질문하기