codingtest

14499번 - 주사위 굴리기

2026-02-01
2분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 48분

문제 요약

  • 크기 N × M의 지도 위에서 주사위를 굴리는 시뮬레이션 문제
  • 주사위는 동(1), 서(2), 북(3), 남(4) 방향으로 이동
  • 이동할 때마다
  • 이동이 유효할 때마다 주사위 윗면의 값 출력
  • 지도를 벗어나는 명령은 무시

문제 풀이

이 문제를 처음 봤을 때 가장 고민했던 부분은

👉 주사위 상태를 어떻게 표현하고 관리할 것인가?

였다.

조금만 생각해보면, 주사위는 결국 6개의 면만 잘 관리하면 된다.

그래서 다음과 같이 1차원 배열로 표현했다.

plain text
index 0 → 위
index 1 → 아래
index 2 → 북
index 3 → 남
index 4 → 동
index 5 → 서

즉,

java
int[] dice =  new int[6];

이 배열 하나로 모든 상태를 관리할 수 있다.


🔄 주사위 굴리기 로직

주사위를 굴린다는 것은

특정 방향에 따라 면의 위치를 회전시키는 것이다.

예를 들어,

동쪽으로 굴릴 때 (1번)

plain text
위 → 서 → 아래 → 동 → 위

즉, 네 면이 순환한다.

북쪽으로 굴릴 때 (3번)

plain text
위 → 남 → 아래 → 북 → 위

이처럼 방향에 따라 4개의 면만 회전시키면 된다.

결국 핵심은 배열 값 스왑만 정확히 구현하는 것이다.


🗺️ 이동 처리

  1. 방향에 따라 좌표 이동
  2. 범위를 벗어나면 continue
  3. 주사위 회전
  4. 지도 값과 주사위 바닥면 값 처리
  5. 윗면 출력

이 문제는 전형적인 구현 + 시뮬레이션 문제이기 때문에

복잡한 알고리즘은 필요하지 않고,

👉 조건을 빠짐없이 정확하게 처리하는 것이 핵심이다.


⚙️ 시간 복잡도

  • 명령 개수 K ≤ 1000
  • 각 명령마다 O(1)O(1)처리

따라서 전체 시간 복잡도는 O(K)O(K)로 매우 가볍다.


최종 코드

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int[][] dir = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[][] map = new int[n][m];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int[] dice = new int[6]; //위, 아래, 북, 남, 동, 서

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < k; i++) {
            int now = Integer.parseInt(st.nextToken());

            int tx = x + dir[now - 1][0];
            int ty = y + dir[now - 1][1];

            if (tx < 0 || tx >= n || ty < 0 || ty >= m)
                continue;

            x = tx;
            y = ty;

            int temp;
            switch (now){
                case 1:
                    temp = dice[0];
                    dice[0] = dice[5];
                    dice[5] = dice[1];
                    dice[1] = dice[4];
                    dice[4] = temp;
                    break;
                case 2:
                    temp = dice[0];
                    dice[0] = dice[4];
                    dice[4] = dice[1];
                    dice[1] = dice[5];
                    dice[5] = temp;
                    break;
                case 3:
                    temp = dice[0];
                    dice[0] = dice[3];
                    dice[3] = dice[1];
                    dice[1] = dice[2];
                    dice[2] = temp;
                    break;
                case 4:
                    temp = dice[0];
                    dice[0] = dice[2];
                    dice[2] = dice[1];
                    dice[1] = dice[3];
                    dice[3] = temp;
                    break;
            }

            if(map[x][y]==0){
                map[x][y] = dice[1];
            }else{
                dice[1] = map[x][y];
                map[x][y] = 0;
            }

            System.out.println(dice[0]);
        }
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-04-02

5430번 - AC

함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.