2 분 소요

문제

문제 바로가기

입력

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

둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10 미만의 자연수 또는 0이다.

마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.

출력

이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.


접근방법

  2
4 1 3
  5
  6

문제에 주어지는 전개도의 순서대로 dice에 주사위의 각 면을 인덱스로 만들고, 주사위에 적혀 있는 수를 집어넣었다.

이동하는 방향에 따른 주사위 면의 변화를 swith문을 통해 구현해주었다.

풀이

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

public class Main {
    static int N, M, K;
    static int x, y;
    static int[][] map;
    static int[] dice = new int[6];
    static int[] cmd;
    static int[] dx = {0, 0, 0, -1, 1};
    static int[] dy = {0, 1, -1, 0, 0};
    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());
        x = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        map = new int[N][M];
        cmd = new int[K];

        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());
            }
        }
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < K; i++) {
            cmd[i] = Integer.parseInt(st.nextToken());
        }

        for(int i = 0; i < K; i++) {
            int tx = x + dx[cmd[i]];
            int ty = y + dy[cmd[i]];
            if(tx >= 0 && ty >= 0 && tx < N && ty < M) {
                dice = move(tx, ty, cmd[i]);
                System.out.println(dice[0]);
                x = tx;
                y = ty;
            }
        }
    }

    public static int[] move(int x, int y, int dict) {
        int[] t_dice = new int[6];
        for(int i = 0; i < 6; i++) {
            t_dice[i] = dice[i];
        }
        switch(dict) {
            case 1:
                t_dice[0] = dice[3];
                t_dice[1] = dice[1];
                t_dice[2] = dice[0];
                t_dice[3] = dice[5];
                t_dice[4] = dice[4];
                t_dice[5] = dice[2];
                break;
            case 2:
                t_dice[0] = dice[2];
                t_dice[1] = dice[1];
                t_dice[2] = dice[5];
                t_dice[3] = dice[0];
                t_dice[4] = dice[4];
                t_dice[5] = dice[3];
                break;
            case 3:
                t_dice[0] = dice[4];
                t_dice[1] = dice[0];
                t_dice[2] = dice[2];
                t_dice[3] = dice[3];
                t_dice[4] = dice[5];
                t_dice[5] = dice[1];
                break;
            case 4:
                t_dice[0] = dice[1];
                t_dice[1] = dice[5];
                t_dice[2] = dice[2];
                t_dice[3] = dice[3];
                t_dice[4] = dice[0];
                t_dice[5] = dice[4];
                break;
        }
        if(map[x][y] == 0) {
            map[x][y] = t_dice[5];
        }
        else {
            t_dice[5] = map[x][y];
            map[x][y] = 0;
        }
        return t_dice;
    }
}

댓글남기기