박정준@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
댓글
아직 댓글이 없습니다.