2차원 배열: 격자 데이터 다루기
공식
2차원 배열이란?
2차원 배열 은 값을 행(row)과 열(column) 로 이루어진 격자에 담습니다.
지도, 표, 이미지처럼 "가로 × 세로" 모양의 데이터를 다룰 때 씁니다.
a[i][j] 는 i행 j열의 값입니다.
1. 선언과 입력
격자가 N행 M열일 때:
C++
#include <bits/stdc++.h>
using namespace std;
int a[1000][1000];
int main() {
int n, m; cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> a[i][j];
}
Python
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
붙어 있는 숫자 격자(예: 10110)를 한 줄씩 읽을 땐:
a = [list(map(int, input().strip())) for _ in range(n)]
2. 이중 반복으로 순회
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << ' ';
cout << '\n';
}
바깥 루프가 행, 안쪽 루프가 열입니다. 출력할 때 한 행이 끝나면
줄바꿈을 넣는 것을 잊지 마세요.
3. 자주 쓰는 패턴
행 합 / 열 합
for (int i = 0; i < n; i++) {
long long rowSum = 0;
for (int j = 0; j < m; j++) rowSum += a[i][j];
}
상하좌우 이웃 보기 — 격자 문제의 핵심 기술입니다.
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
for (int d = 0; d < 4; d++) {
int ni = i + dx[d], nj = j + dy[d];
if (ni < 0 || ni >= n || nj < 0 || nj >= m) continue; // 격자 밖이면 건너뜀
// a[ni][nj] 사용
}
이 경계 검사(범위 밖이면 무시) 패턴은 미로·영역 문제에서 끊임없이 등장하니
손에 익혀 두세요.
4. 행과 열을 헷갈리지 않기
a[i][j] 에서 앞이 행(세로 위치), 뒤가 열(가로 위치) 입니다. 좌표를
(x, y)로 부르는 문제에서는 어느 쪽이 행인지 한 번 정해 끝까지 지키세요.
보통 a[행][열], 즉 a[y][x]로 두면 헷갈림이 적습니다.
5. 자주 하는 실수
- 행/열 뒤바꿈 —
a[j][i]처럼 인덱스를 뒤집어 접근. 한 가지 규칙으로 통일하세요. - 경계 밖 접근 — 이웃을 볼 때
ni,nj가 격자를 벗어나는데 검사를 빠뜨림. 위 3번의 범위 검사를 항상 넣으세요. - 크기 부족 / 초기화 누락 —
N×M보다 작게 잡거나, 누적 배열을 0으로 시작하지 않음.
연습 팁
격자 문제는 작은 예제(예: 3×3)를 종이에 직접 그려 인덱스를 손으로 짚어
보면 훨씬 빨리 이해됩니다. dx/dy 배열로 이웃을 도는 패턴은 한 번 외워 두면
앞으로 나올 수많은 격자·탐색 문제에서 그대로 재사용할 수 있습니다.