백준 – 주사위를 굴려

솔루션 방법

직접 정육면체를 그려서 동서남북으로 하나씩 굴려가며 재배치하는 방법을 알아냈습니다.

암호

package test;

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

public class 주사위굴리기 {
   /*
        4 2 0 0 8
      0 2
      3 4
      5 6
      7 8
      4 4 4 1 3 3 3 2
    * */

   public static void main(String() args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      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);
      int ()command = new int(K);
      int ()dice = new int(6); // 밑 오 왼 상 하 위
      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++) {
         command(i) = Integer.parseInt(st.nextToken());
         //굴릴떄 주사위의 위치를 조정해주기위해
         int temp0=dice(0); //밑
         int temp1=dice(1); //오
         int temp2=dice(2); //왼
         int temp3=dice(3); //상
         int temp4=dice(4); //하
         int temp5=dice(5); //위
         //동 서 북 남 1 2 3 4
         if(command(i) == 1) {
            //이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
            int dy = y+1;
            if(x>=0 && x<N && dy>=0 && dy<M) {
               y+=1;
               //System.out.println("현재 좌표"+x+" "+y);
               //System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
               
               //주사위 동쪽으로 먼저굴리고
               dice(0) = temp1;
               dice(1) = temp5;
               dice(2) = temp0;
               dice(3) = temp3;
               dice(4) = temp4;
               dice(5) = temp2;
               //현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
               if(map(x)(y)!=0) {
                  dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
                  map(x)(y) = 0; //좌표는 0으로 바뀜
               }else {
                  map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
               }
               System.out.println(dice(5));
            }else {
               continue;
            }
            
         }else if(command(i)==2) {//주사위 서쪽으로 굴렸을때
            //이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
            int dy = y-1;
            if(x>=0 && x<N && dy>=0 && dy<M) {
               y-=1;
               //System.out.println("현재 좌표"+x+" "+y);
              // System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
               //주사위 서쪽으로 먼저굴리고
               dice(0) = temp2;
               dice(1) = temp0;
               dice(2) = temp5;
               dice(3) = temp3;
               dice(4) = temp4;
               dice(5) = temp1;
               //현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
               if(map(x)(y)!=0) {
                  dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
                  map(x)(y) = 0; //좌표는 0으로 바뀜
               }else {
                  map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
               }
               System.out.println(dice(5));
            }else {
               continue;
            }
            
         }else if(command(i)==3) {//주사위 북쪽으로 굴렸을때
            //이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
            int dx = x-1;
            if(dx>=0 && dx<N && y>=0 && y<M) {
               x=dx;
              // System.out.println("현재 좌표"+x+" "+y);
               //System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
               //주사위 북쪽으로 먼저굴리고
               dice(0) = temp3;
               dice(1) = temp1;
               dice(2) = temp2;
               dice(3) = temp5;
               dice(4) = temp0;
               dice(5) = temp4;
               //현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
               if(map(x)(y)!=0) {
                  dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
                  map(x)(y) = 0; //좌표는 0으로 바뀜
               }else {
                  map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
               }
               System.out.println(dice(5));
            }else {
               continue;
            }
         }else if(command(i)==4) {//주사위 남쪽으로 굴렸을때
            //이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
            int dx = x+1;
            if(dx>=0 && dx<N && y>=0 && y<M) {
               x=dx;
              // System.out.println("현재 좌표"+x+" "+y);
               //System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
               //주사위 남쪽으로 먼저굴리고
               dice(0) = temp4;
               dice(1) = temp1;
               dice(2) = temp2;
               dice(3) = temp0;
               dice(4) = temp5;
               dice(5) = temp3;
               //현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
               if(map(x)(y)!=0) {
                  dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
                  map(x)(y) = 0; //좌표는 0으로 바뀜
               }else {
                  map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
               }
               System.out.println(dice(5));
            }else {
               continue;
            }
         }
      }
      
      
   }

}