시뮬레이션은 문제에서 제시한 규칙을 코드로 그대로 옮겨 구현하는 유형이다. 별도의 알고리즘 공식보다는 조건과 흐름을 정확히 파악하고 실수 없이 구현하는 능력이 핵심이다.
이번 챕터에서는 2차원 배열 기반의 좌표 연산, 대칭·회전 변환, 대각선 순회, 행렬 연산을 다룬다. 모두 코딩 테스트에서 반복적으로 출제되는 핵심 패턴이다.
코딩 테스트에서 2차원 평면은 2차원 배열로 표현하는 것이 가장 직관적이다. 이때 y좌표 → 행(row) 인덱스, x좌표 → 열(col) 인덱스로 대응시킨다.
예를 들어, 좌표 (3, 4)는 배열의 arr[4][3]에 해당한다.
수학 좌표계와 배열 인덱스의 y축 방향이 반대임을 항상 주의해야 한다.
| 수학 좌표 | 배열 표현 | 의미 |
|---|---|---|
| (x, y) | arr[y][x] | y = 행 인덱스, x = 열 인덱스 |
| (3, 4) | arr[4][3] | 4행 3열 |
현재 좌표에서 인접한 좌표로 이동할 때 오프셋 배열 dy, dx를 사용하면
하드코딩 없이 반복문으로 깔끔하게 처리할 수 있다.
실제 시뮬레이션 문제의 대부분이 이 방식을 활용한다.
// 8방향: 상좌, 상, 상우, 우, 하우, 하, 하좌, 좌 int dy[] = {-1, -1, -1, 0, 1, 1, 1, 0}; int dx[] = {-1, 0, 1, 1, 1, 0, -1, -1}; // 현재 위치 (y, x)에서 인접한 8개 좌표 순회 for (int i = 0; i < 8; i++) { int ny = y + dy[i]; int nx = x + dx[i]; // 범위 체크 후 처리 if (ny >= 0 && ny < N && nx >= 0 && nx < N) { // 유효한 인접 좌표 처리 } }
dy = {-1, 1, 0, 0}, dx = {0, 0, -1, 1}으로 줄일 수 있다.
같은 인덱스끼리 짝을 이루는 구조가 핵심이다.
N×N 배열에서 좌표 변환 공식을 암기해 두면 시뮬레이션 문제에서 바로 적용할 수 있다.
| 변환 | 공식 (Y, X) → | 변화하지 않는 축 |
|---|---|---|
| 좌우 대칭 | (Y, (N-1) - X) |
Y 고정, X만 변환 |
| 상하 대칭 | ((N-1) - Y, X) |
X 고정, Y만 변환 |
| 90도 회전 (시계) | ((N-1) - X, Y) |
행·열 모두 변환 |
| 180도 회전 | 90도 회전 2회 적용 | — |
| 270도 회전 | 90도 회전 3회 적용 | — |
같은 대각선 상에 있는 원소들을 판별하는 조건과 이동 방향을 정리한다.
| 종류 | 다음 원소 이동 | 같은 대각선 판별 조건 |
|---|---|---|
| 정방향 대각선 (↘) | (Y+1, X+1) |
Y - A == X - B |
| 역방향 대각선 (↙) | (Y+1, X-1) |
Y - A == B - X |
정방향은 Y - X 값이 같은 원소끼리 같은 대각선이고,
역방향은 Y + X 값이 같은 원소끼리 같은 대각선이다.
행렬 덧셈 / 뺄셈
두 행렬의 크기가 같을 때, 같은 위치의 원소끼리 더하거나 빼는 연산이다. 결과 행렬의 크기는 입력 행렬과 동일하다.
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) C[i][j] = A[i][j] + B[i][j];
행렬 곱셈
A의 X행과 B의 Y열의 원소를 각각 곱한 후 합산하여 C[X][Y]를 완성한다.
연산이 가능하려면 A의 열 수 == B의 행 수여야 한다.
결과 행렬 C의 크기는 A의 행 수 × B의 열 수다.
// A: N×M, B: M×K → C: N×K for (int i = 0; i < N; i++) for (int j = 0; j < K; j++) for (int k = 0; k < M; k++) C[i][j] += A[i][k] * B[k][j];
| 연산 | 전제 조건 | 결과 크기 |
|---|---|---|
| 덧셈 / 뺄셈 | 두 행렬 크기 동일 | 입력과 동일 |
| 곱셈 | A의 열 수 == B의 행 수 | A의 행 수 × B의 열 수 |
| 항목 | 내용 |
|---|---|
| 새로 배운 것 | 좌표 변환 공식(좌우·상하 대칭, 90도 회전)을 표로 정리하니 패턴이 명확해졌다. 대각선 판별 조건도 Y - X와 Y + X로 단순화할 수 있다는 점이 유용했다. |
| 어려웠던 점 | 90도 회전 시 임시 배열 없이 원본에 바로 쓰면 안 된다는 것을 직접 실수하면서 깨달았다. 변환 공식보다 구현 시 덮어쓰기 문제를 놓치기 쉽다. |
| 기억할 핵심 | dy·dx 오프셋 배열은 방향 이동 문제의 기본 패턴이므로 4방향·8방향 모두 손에 익혀둬야 한다. 행렬 곱셈은 A열 == B행 조건과 3중 반복문 구조를 반드시 암기한다. |
| 다음 목표 | 달팽이 수열(문제 64)과 캐릭터 좌표(문제 69)를 직접 구현해보고, 회전·대칭 변환이 포함된 추가 문제도 찾아서 풀어볼 예정이다. |
'프로그래밍 > 코드카타' 카테고리의 다른 글
| [C++] 코딩테스트에서의 정렬 (0) | 2026.05.11 |
|---|---|
| [C++] 코딩테스트에서의 배열 (0) | 2026.05.07 |
| [C++] 재귀 함수를 코드로 (0) | 2026.05.06 |
| [C++] 입출력 데이터 다루기 - 숫자 연산과 문자열 스트림 정리 (0) | 2026.04.28 |
| [코딩 테스트] 어떻게 준비하고 어떻게 풀어야 할까? (1) | 2026.04.27 |