인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

황승환님의 프로필 이미지
황승환

작성한 질문수

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

87. 섬나라 아일랜드(BFS 활용)

queue를 지역변수, 전역변수로 선언하는 것의 차이

작성

·

581

0

Queue를 전역변수랑 지역변수랑 선언했을 때 채점 결과가 다르게 나오던데 이 둘의 차이가 무엇인가요?

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

int map[21][21];
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={-1,-1,0,1,1,1,0,-1};

struct Pos {
	int x,y;
	Pos(int a, int b) {
		x=a;
		y=b;
	}
};
// queue<Pos> Q; // 전역변수로 선언하면 100점?
int main(void) {
	int n,cnt=0;
	scanf("%d",&n);
	queue<Pos> Q; // 지역변수로 선언하면 80점?
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			scanf("%d",&map[i][j]);
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			if(map[i][j]==1) {
				Q.push(Pos(i,j));
				map[i][j]=0;
				while(!Q.empty()) {
					Pos tmp=Q.front();
					Q.pop();
					for(int k=0;k<8;k++) {
						int xx=tmp.x+dx[k];
						int yy=tmp.y+dy[k];
						if(map[xx][yy]==1) {
							Q.push(Pos(xx,yy));
							map[xx][yy]=0;
						}
					}
				}
				cnt++;	
			}
		}
	}
	printf("%d",cnt);
}

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

큐가 전역이나 지역이냐로 발생하는 문제라기 보다는 map 2차원을 1번 인덱스부터 쓰려면 최소한 map[22][22] 이상의 크기로 잡아야 합니다. map[21][21]로 잡으면 파이썬이나 자바같으면 index out of range에러가 납니다(tmp.x값이 20일때 8방향을 탐색하는 xx값은 21이 되는 경우가 있습니다)  하지만 C는 이런 에러를 알려주지 않고 자체적으로 메모리를 확장해서 실행하다보니 의도치 않은 일들이 벌어지는 것입니다.

황승환님의 프로필 이미지
황승환

작성한 질문수

질문하기