이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[백준] 14499 주사위 굴리기 -Java

  • 2022.02.20 12:35
  • Algorithm/Baekjoon
반응형

 

 

 

문제 이해가 매우 중요하다. 차근차근 생각해보자.

 

 

1. 문제에서 주어지는 좌표계를 먼저 이해하자.

 

문제에서 주어지는 첫 번째 예제에 대해 생각해보자.

 

 

 

 지도는 이차원 배열로 저장한다.

 

int[][] map = new int[N][M];

이런 형태로 저장하게 되는데

 

이 배열에 대한 좌표계는 좌측 그림과 같아진다.

 

x와 y를 설정한다고 하면 (1,0)위치는 3이 되고 (2,1)위치는 6이 된다.

 

 

 

 

 

 

2. 주사위의 회전을 이해하자.

 

주사위의 각 요소를 인덱스로 생각하고 회전을 진행하자.

주사위의 요소는 6가지이므로 크기가 6인 배열을 주사위로 취급한다.

 

 

 

초기 주사위에서 오른쪽으로 회전을 진행한 후의 모습이다.

 

처음에는 인덱스 1이 윗부분, 인덱스 6이 아랫부분을 차지하고 있고, 회전을 진행한 후에는 인덱스 4가 윗부분, 인덱스 3이 아랫부분을 차지게 된다.

 

 

 

 

위 내용을 바탕으로 회전을 구현한다.

 

 

3. 회전할 수 없는 경우를 구분하자.

 

명령을 입력받을 때 마다 주사위의 좌표를 업데이트해서 회전을 할 수 없는 경우를 구분해야 한다.

 

 

 

 

Java

 

 

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

public class Main {
	static int[][] map;
	static int[] dice = {0, 0, 0, 0, 0, 0};

	public static void main(String[] args) throws IOException {
		
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		map = new int[N][M];
		
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		for(int i=0; i<N; i++){
			StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
			for(int j =0; j<M; j++){
				map[i][j] = Integer.parseInt(st2.nextToken());
			}
		} // 지도에 값 넣어주기

		StringTokenizer st3 = new StringTokenizer(br.readLine(), " ");

		for(int i=0; i<k; i++){
			boolean check = false;
			switch(Integer.parseInt(st3.nextToken())){
				
				case 1:
				if(y < M-1){
					rotate(dice, 1);
					check = true;
					y++;
				}
				break;

				case 2:
				if(y > 0){
					rotate(dice, 2);
					check = true;
					y--;
				}
				break;

				case 3:
				if(x>0){
					rotate(dice, 3);
					check = true;
					x--;
				}
				break;

				case 4:
				if(x<N-1){
					rotate(dice, 4);
					check = true;
					x++;
					
				}
			}

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

				sb.append(dice[0]).append('\n');
			}


		}

		System.out.println(sb);


		

	}

	static void rotate(int[] dice, int dir){
		int[][] rotation = {{4,2,1,6,5,3}, {3,2,6,1,5,4}, {5,1,3,4,6,2}, {2,6,3,4,1,5}};
		 // 기본형 전개도에서 동서남북으로 회전할 시 나올 수 있는 경우의수를 계산함
		 // 이 때 주사위는 인덱스로 접근
		 // 0 번째는 동쪽 1 번째는 서쪽 2 번쨰는 북쪽 3 번째는 남쪽
		 
		 int[] temp = new int[6];

		 dir = dir -1; // 배열로 접근하니까 -1 해줌

		 for(int i=0; i<6; i++){
			 temp[rotation[dir][i]-1] = dice[i]; 
		 }
		 // 주사위에 있는 값들을 회전한 주사위의 인덱스에 넣어준다.

		 for(int i=0; i<6; i++){
			 dice[i] = temp[i];
		 }
		
		 // 인덱스에 넣어줬으니 다시 옮겨준다
		 
		 


		 
	}


}
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 14890 경사로 -Java  (0) 2022.03.01
[백준] 15683 감시 -Java  (0) 2022.02.21
[백준] 14891 톱니바퀴 -Java  (0) 2022.02.19
[백준] 1850 최대공약수 -Java  (1) 2022.02.18
[백준] 10994 별 찍기 - 23 - Java  (0) 2022.02.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [백준] 14890 경사로 -Java

    [백준] 14890 경사로 -Java

    2022.03.01
  • [백준] 15683 감시 -Java

    [백준] 15683 감시 -Java

    2022.02.21
  • [백준] 14891 톱니바퀴 -Java

    [백준] 14891 톱니바퀴 -Java

    2022.02.19
  • [백준] 1850 최대공약수 -Java

    [백준] 1850 최대공약수 -Java

    2022.02.18
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (682)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (12)
    • 💬 기록 (8)
    • 📚 공부 (7)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바