[C++] 코딩테스트에서의 시뮬레이션

2026. 5. 12. 23:09·프로그래밍/코드카타
1개요

시뮬레이션은 문제에서 제시한 규칙을 코드로 그대로 옮겨 구현하는 유형이다. 별도의 알고리즘 공식보다는 조건과 흐름을 정확히 파악하고 실수 없이 구현하는 능력이 핵심이다.

이번 챕터에서는 2차원 배열 기반의 좌표 연산, 대칭·회전 변환, 대각선 순회, 행렬 연산을 다룬다. 모두 코딩 테스트에서 반복적으로 출제되는 핵심 패턴이다.


2y, x 좌표 표현하기

코딩 테스트에서 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열

3dy, dx 배열로 인접 좌표 이동하기

현재 좌표에서 인접한 좌표로 이동할 때 오프셋 배열 dy, dx를 사용하면 하드코딩 없이 반복문으로 깔끔하게 처리할 수 있다. 실제 시뮬레이션 문제의 대부분이 이 방식을 활용한다.

C++ · dy, dx 오프셋 배열 (8방향)
// 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) {
        // 유효한 인접 좌표 처리
    }
}
💡 4방향만 필요하다면 dy = {-1, 1, 0, 0}, dx = {0, 0, -1, 1}으로 줄일 수 있다. 같은 인덱스끼리 짝을 이루는 구조가 핵심이다.

4대칭과 회전 변환 공식

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회 적용 —
⚠️ 90도 회전 후 결과를 원본 배열에 바로 쓰면 덮어쓰기 충돌이 발생한다. 반드시 별도의 임시 배열에 결과를 저장한 뒤 원본에 복사해야 한다.

5대각선 행렬 순회

같은 대각선 상에 있는 원소들을 판별하는 조건과 이동 방향을 정리한다.

종류다음 원소 이동같은 대각선 판별 조건
정방향 대각선 (↘) (Y+1, X+1) Y - A == X - B
역방향 대각선 (↙) (Y+1, X-1) Y - A == B - X

정방향은 Y - X 값이 같은 원소끼리 같은 대각선이고, 역방향은 Y + X 값이 같은 원소끼리 같은 대각선이다.


6행렬 연산

행렬 덧셈 / 뺄셈

두 행렬의 크기가 같을 때, 같은 위치의 원소끼리 더하거나 빼는 연산이다. 결과 행렬의 크기는 입력 행렬과 동일하다.

C++ · 행렬 덧셈
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의 열 수다.

C++ · 행렬 곱셈
// 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의 열 수

7오늘의 회고
항목내용
새로 배운 것 좌표 변환 공식(좌우·상하 대칭, 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
'프로그래밍/코드카타' 카테고리의 다른 글
  • [C++] 코딩테스트에서의 정렬
  • [C++] 코딩테스트에서의 배열
  • [C++] 재귀 함수를 코드로
  • [C++] 입출력 데이터 다루기 - 숫자 연산과 문자열 스트림 정리
hanong8
hanong8
hanong8 님의 블로그 입니다.
  • hanong8
    HaNong
    hanong8
  • 전체
    오늘
    어제
    • 분류 전체보기 (101) N
      • 프로그래밍 (98) N
        • Unreal Engine 5 (45)
        • C++ (22)
        • UML (2)
        • 자료구조 (2)
        • 알고리즘 (9)
        • 개발일지 (4)
        • DirectX11 (5)
        • Git (2)
        • 코드카타 (7) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hanong8
[C++] 코딩테스트에서의 시뮬레이션
상단으로

티스토리툴바