KwanIk Devlog

1. 문제

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

 

2. 풀이

구현 문제이지만 주사위를 굴리는 방법을 구현하는 과정에서 실수를 범하기 좋은 유형의 문제다. 하지만 문제는 꽤나 단순하게 접근할 수 있는데, 그 이유는 주사위 6면에 대해서는 1차원 배열로 선언이 가능하며 네 방위(동, 서, 남, 북)로 움직이는 행위만 잘 정의해주면 되기 때문이다. 따라서, 각 배열의 index에 대해 위치를 사전에 정의해두고, 이를 네 방면으로 굴렸을 때 인덱스가 어떻게 변하는지만 정리하여 구현하면 된다. 배열 index가 변하는 것은 아래 표를 참고하자.

 

case 윗면 북쪽 동쪽 서쪽 남쪽 밑면
origin 0 1 2 3 4 5
3 1 0 5 4 2
2 1 5 0 4 3
1 5 2 3 0 4
4 0 2 3 5 1

 

필자는 주사위(Dice) 클래스를 선언하고 클래스 내에서 움직임 처리를 진행해주었다.

 

3. 소스코드

더보기
public class Main {
    static final int[] dy = {0, 0, -1, 1};
    static final int[] dx = {1, -1, 0, 0};

    static int N, M;
    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        int y = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        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());
            }
        }

        Dice dice = new Dice(y, x);

        st = new StringTokenizer(br.readLine());
        while (K-- > 0) {
            dice.roll(Integer.parseInt(st.nextToken()) - 1);
        }

        System.out.print(dice.getMovement().trim());
        br.close();
    }

    static class Dice {
        int y, x;
        int[] num = new int[6];
        StringBuilder sb = new StringBuilder();

        public Dice(int y, int x) {
            this.y = y;
            this.x = x;
        }

        void roll(int dir) {
            int ny = y + dy[dir];
            int nx = x + dx[dir];

            if (ny < 0 || nx < 0 || N <= ny || M <= nx) return;

            // 위, 동, 북, 서, 남, 밑
            int tmp = num[0];
            switch (dir) {
                case 0: // 동
                    num[0] = num[3];
                    num[3] = num[5];
                    num[5] = num[2];
                    num[2] = tmp;
                    break;
                case 1: // 서
                    num[0] = num[2];
                    num[2] = num[5];
                    num[5] = num[3];
                    num[3] = tmp;
                    break;
                case 2: // 남
                    num[0] = num[1];
                    num[1] = num[5];
                    num[5] = num[4];
                    num[4] = tmp;
                    break;
                default: // 북
                    num[0] = num[4];
                    num[4] = num[5];
                    num[5] = num[1];
                    num[1] = tmp;
            }

            if (map[ny][nx] == 0) {
                map[ny][nx] = num[5];
            } else {
                num[5] = map[ny][nx];
                map[ny][nx] = 0;
            }

            y = ny;
            x = nx;

            sb.append(num[0]).append("\n");
        }

        String getMovement() {
            return sb.toString();
        }
    }
}

 

 

GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

Baekjoon Online Judge - explanation of solved problems and complete code - GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

github.com

 

반응형

'Algorithm > 문제풀이' 카테고리의 다른 글

[ 백준 3190번 ] 뱀  (3) 2023.03.03
[ 백준 10819번 ] 차이를 최대로  (0) 2023.03.03
[ 백준 2003번 ] 수들의 합2  (0) 2023.03.02
[ 백준 14503번 ] 로봇 청소기  (0) 2023.03.01
[ 백준 1759번 ] 암호 만들기  (1) 2023.03.01
profile

KwanIk Devlog

@갈닉

노력하는 개발자가 되고자 합니다. GitHub이나 블로그 모두 따끔한 피드백 부탁드립니다 :)