박정준@jungjun · Aug 12, 2026

격자 시뮬레이션에서 방향 회전 처리하기

아기 고래의 첫 항해

삼성 2026 상반기 오후 1번 문제

1. 입력 방향을 그대로 쓰기 어려운 이유

문제에서 방향은 다음과 같이 주어진다.

1: 상
2: 하
3: 좌
4: 우

하지만 이 번호는 실제 회전 순서인

상 → 우 → 하 → 좌

와 다르다.

예를 들어 상이 1일 때 1 + 1 = 2이지만, 방향 2는 우가 아니라 하이다. 따라서 입력 방향 번호로는 회전을 간단하게 계산하기 어렵다.


2. 프로그램 내부 방향

회전을 편하게 처리하기 위해 내부에서는 방향을 시계 방향 순서로 다시 정의한다.

0: 상
1: 우
2: 하
3: 좌
int dr[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};

현재 위치가 (r, c)이고 방향이 d라면 다음 위치는 다음과 같다.

int nr = r + dr[d];
int nc = c + dc[d];

3. 입력 방향 변환

문제에서 주어진 방향을 내부 방향으로 변환한다.

int dirMap[5] = {
    -1,
    0, // 입력 1: 상
    2, // 입력 2: 하
    3, // 입력 3: 좌
    1  // 입력 4: 우
};

d = dirMap[d];

4. 회전 공식

방향을 시계 방향 순서로 저장하면 회전을 다음처럼 계산할 수 있다.

직진       = d
좌회전     = (d + 3) % 4
우회전     = (d + 1) % 4
180도 회전 = (d + 2) % 4

좌회전은 원래 d - 1이지만, 음수가 나오는 것을 피하기 위해 d + 3을 사용한다.


5. 문제의 이동 우선순위 구현

문제에서는 다음 순서로 이동 가능한 칸을 확인한다.

직진 → 좌회전 → 우회전 → 180도 회전

따라서 다음과 같이 방향 배열을 만든다.

int candidate[4] = {
    d,
    (d + 3) % 4,
    (d + 1) % 4,
    (d + 2) % 4
};

이후 앞에서부터 확인하여 처음 발견한 이동 가능한 칸으로 이동한다.

for (int i = 0; i < 4; i++) {
    int nd = candidate[i];

    int nr = r + dr[nd];
    int nc = c + dc[nd];

    if (nr < 0 || nr >= N || nc < 0 || nc >= N)
        continue;

    if (board[nr][nc] == 1 || visited[nr][nc])
        continue;

    r = nr;
    c = nc;
    d = nd;
    visited[r][c] = true;

    break;
}

이동한 뒤에는 반드시 다음 코드로 방향을 갱신해야 한다.

d = nd;

예를 들어 상을 보다가 좌회전하여 왼쪽으로 이동했다면, 다음부터는 왼쪽이 직진 방향이 된다.


핵심 정리

이 문제는 현재 바라보는 방향을 기준으로 회전해야 하지만, 입력 방향 번호는 회전 순서대로 되어 있지 않다.

따라서 내부 방향을 다음처럼 바꿔서 사용한다.

0: 상, 1: 우, 2: 하, 3: 좌

이렇게 하면 다음 공식으로 방향을 쉽게 처리할 수 있다.

우회전: +1
좌회전: +3
180도 회전: +2

댓글

아직 댓글이 없습니다.