본문 바로가기

알고리즘

[BOJ] 14499번: 주사위 굴리기 (JAVA)

https://www.acmicpc.net/problem/14499

 

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

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

public class Main {

    static int N,M,a,b;
    static int[][] map;
    static int[] dx = {0,0,0,-1,1};
    static int[] dy = {0,1,-1,0,0};
    static int[] dice = new int[6];


    static void move(int x, int y, int d){

        int nx = x+dx[d];
        int ny = y+dy[d];
        if(!isIn(nx,ny)) return;
        int num = map[nx][ny];
        int[] tmp = new int[6];
        for(int i=0;i<6;i++){
            tmp[i] = dice[i];
        }
        switch(d){
            case 1:
                dice[0] = tmp[3]; dice[2] = tmp[0]; dice[3] = tmp[5]; dice[5] = tmp[2];
                break;
            case 2:
                dice[0] = tmp[2]; dice[2] = tmp[5]; dice[3] = tmp[0]; dice[5] = tmp[3];
                break;
            case 3:
                dice[0] = tmp[4]; dice[1] = tmp[0]; dice[4] = tmp[5]; dice[5] = tmp[1];
                break;
            case 4:
                dice[0] = tmp[1]; dice[1] = tmp[5]; dice[4] = tmp[0]; dice[5] = tmp[4];
                break;
        }
        if(num==0){
            map[nx][ny] = dice[5];
        }
        else{
            dice[5] = map[nx][ny];
            map[nx][ny] = 0;
        }
        a = nx;
        b = ny;
        System.out.println(dice[0]);
    }

    static boolean isIn(int x, int y){
        if(x<0||x>=N||y<0||y>=M) return false;
        return true;
    }

    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];
        a = Integer.parseInt(st.nextToken());
        b = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        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++){
            int d = Integer.parseInt(st.nextToken());
            move(a,b,d);
        }


    }
}

 

index 0 1 2 3 4 5
기존 1 2 3 4 5 6
동(1) 4 2 1 6 5 3
서(2) 3 2 6 1 5 4
북(3) 5 1 3 4 6 2
남(4) 2 6 3 4 1 5

주어진 전개도를 가지고 동, 서, 북, 남으로 굴렸을 때 주사위 배열 값이 어떻게 변하는지를 찾아냈다.

문제를 잘못읽어서 남(3), 북(4) 로 잘못 풀었었다. 문제를 잘 읽도록 하자 !

주사위 굴러가는 부분만 잘 구현한다면 어렵지 않게 풀 수 있는 문제였다. 

문제를 푼 뒤 배열 복사에 대해 공부하였다. https://tech-heng.tistory.com/67