본문 바로가기

All Categories/Algorithm

BOJ 백준 14499번 주사위 굴리기 Java

반응형
 

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

이 문제는 지도 위에서 주사위는 동(1), 서(2), 북(3), 남(4) 방향으로 굴릴 때 주사위의 윗면의 수를 출력해야 합니다

가장 중점적으로 봐야할 점은 주사위를 4방향으로 굴릴 때, 각 위치가 어떻게 변하는지입니다.

따라서 저는 0부터 5까지 바닥, 동, 서, 남, 북, 위를 설정하고, 4방향으로 굴릴 때의 위치 변화를 저장하는 배열을 만들었습니다.

가장 먼저 각 명령마다 지도의 범위를 벗어나는지 체크합니다. 범위 밖일 때는 아무 행동도 하지 않아야 합니다.

주사위를 굴릴 수 있다면 위와 같이 주사위의 상태를 바꾸고, 지도가 0인지에 따라 상황에 맞는 처리를 해주면 됩니다.

또한 초기 x, y 좌표 값도 올바르게 설정해주면 됩니다!

import java.io.*;
import java.util.*;

public class Main {

    static int N, M, x, y;
    static int[][] map;
    static int[] dice;
    static int[] dx = { 1, -1, 0, 0 }, dy = { 0, 0, -1, 1 }; // 동 서 북 남
    static int[][] dd = { 
            // 바닥 동 서 남 북 위
            { 1, 5, 0, 3, 4, 2 }, // 동
            { 2, 0, 5, 3, 4, 1 }, // 서
            { 4, 1, 2, 0, 5, 3 }, // 북
            { 3, 1, 2, 5, 0, 4 } }; // 남


    static int moveDice(int command) {
        int nx = x + dx[command];
        int ny = y + dy[command];
        if (nx < 0 || nx >= M || ny < 0 || ny >= N) return -1;

        x = nx; y = ny;
        int[] copy = new int[6];
        for (int i = 0; i < 6; i++) copy[i] = dice[dd[command][i]];
        dice = copy.clone();

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

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        N = Integer.parseInt(st.nextToken()); // 가로
        M = Integer.parseInt(st.nextToken()); // 세로
        y = Integer.parseInt(st.nextToken()); // 북에서 떨어진 위치
        x = Integer.parseInt(st.nextToken()); // 서에서 떨어진 위치
        int K = Integer.parseInt(st.nextToken());

        dice = new int[6];
        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());
        }

        st = new StringTokenizer(br.readLine());
        int command, answer;
        for (int i = 0; i < K; i++) {
            command = Integer.parseInt(st.nextToken());
            answer = moveDice(command - 1);
            if (answer == -1) continue;
            else sb.append(answer).append("\n");
        }

        System.out.println(sb);
        br.close();
    }
}
반응형