[코딩테스트] BFS에서 배열 크기를 +@로 설정하는 이유
2025. 2. 9. 07:13ㆍ코딩 도구/기술 & 정보 글 (Tech & Knowledge)
반응형
BFS에서 배열 크기를 +@로 설정하는 이유
BFS(너비 우선 탐색)를 구현할 때, 배열 크기를 문제에서 주어진 크기보다 +@를 해서 선언하는 경우가 많다. 예를 들어, 문제가 M=100, N=100이라고 하면, 배열을 board[102][102]로 설정하는 방식이다.
1. 왜 배열 크기를 +2로 설정하는가?
배열 크기를 +2로 설정하는 가장 큰 이유는 배열의 경계를 벗어나는 오류를 방지하기 위해서다. BFS/DFS를 구현할 때, 보통 상하좌우 네 방향으로 탐색하는데, 이때 탐색 과정에서 배열 범위를 벗어날 가능성이 있다.
예제 코드 (BFS 범위 체크)
if (nx < 0 || nx >= M || ny < 0 || ny >= N)
continue; // 범위를 벗어나면 스킵
위 코드는 (nx, ny)가 배열의 범위를 벗어났을 경우, 즉 nx == M 또는 ny == N이 되면 continue를 해서 다음 탐색으로 넘어가도록 한다. 하지만 배열 크기를 딱 맞게 board[M][N]으로 설정하면 M 또는 ny == N일 때 배열을 초과하여 접근하는 문제가 발생할 수 있다.
이를 방지하기 위해 배열을 M+2, N+2 크기로 선언하면 경계를 체크하는 과정이 더 안전해진다. 즉, board[102][102]로 설정하면, 잘못된 접근이 이루어지더라도 board[100][100]을 벗어나지 않게 된다.
2. 직접 실험해보기 (+2를 하는 이유)
예를 들어, M=5, N=5 크기의 배열을 선언한다고 가정해보자.
배열 크기를 5×5로 설정한 경우
int board[5][5];
- 탐색 범위는 (0부터 4까지), 즉 board[4][4]까지 가능하다.
문제 발생 가능성
- BFS나 DFS를 수행할 때, 이동 가능한 위치가 nx == 5 또는 ny == 5가 되는 순간 board[5][5]에 접근하게 된다.
- 하지만 board[5][5]는 선언되지 않았으므로 런타임 에러 발생 가능성이 있다.
배열 크기를 7×7로 설정한 경우
int board[7][7]; // M=5, N=5이지만 +2 해서 선언
- 탐색 범위는 여전히 (0부터 4까지)지만,
- nx == 5, ny == 5일 경우에도 안전하게 board[5][5]가 존재하므로 에러가 발생하지 않는다.
이 방식의 장점
- 경계값 검사를 할 때 실수를 방지할 수 있다.
- C++은 배열의 범위를 벗어난 접근을 체크하지 않기 때문에, 메모리 접근 오류를 미리 예방 가능하다.
3. 정리 (배열 크기를 +@ 하는 이유)
- BFS/DFS에서 경계를 체크할 때 실수를 방지하기 위함.
- nx == M 또는 ny == N이 되어도 런타임 에러가 발생하지 않도록 안전하게 처리.
- C++에서는 배열의 범위를 넘어서 접근해도 오류 메시지가 발생하지 않고, 이상한 값이 나올 수도 있음. 이를 방지하기 위해 여유 공간을 둠.
그래서 M=100일 때 board[102][102]로 선언하는 것이 일반적이다.
반응형
'코딩 도구 > 기술 & 정보 글 (Tech & Knowledge)' 카테고리의 다른 글
C++에서 endl vs \n 성능 차이 알아보기 (0) | 2025.02.12 |
---|---|
이스케이프 문자 캐리지 리턴(Carriage Return, \r): 개념과 활용 (0) | 2025.01.23 |
청년 창업과 정부 과제 및 청년지원사업 (1) | 2024.12.30 |
나에게 소프트웨어란: 세상을 변화시키는 도구 (2) | 2024.09.13 |
꼭 알아야 할 TOPCIT 시험의 모든 것 (29) | 2024.05.05 |