[백준] 14499 - 주사위 굴리기 (JAVA)

개츠비·2023년 4월 7일
0

백준

목록 보기
57/84
  1. 소요시간 : 1시간 40분
  2. 문제 사이트 : 백준
  3. 문제 수준 : 골드 4
  4. 문제 유형 : 구현, 시뮬레이션
  5. 다른 사람의 풀이를 참고 했는가 ? : O
  6. 한 번 풀었다가 다시 푸는 문제인가 ? : X
  7. 문제 링크 : https://www.acmicpc.net/problem/14499
  8. 푼 날짜 : 2023.04.07

1. 사용한 자료구조 & 알고리즘

구현, 시뮬레이션 사용.

2. 사고과정

문제는 쉽다고 생각했으나 주사위를 굴리는 걸 어떻게 표현해야하나를 1시간 이상 고민해도 답을 찾지 못했음. 이 과정에서 주사위를 굴리는 방법만 다른 사람의 블로그를 참고.

처음에 주사위의 각각 인덱스를 0~5라고 했을 때,
0~5에 해당하는 값을 각각

dice[0]=1;
dice[1]=3;
dice[2]=5;
dice[3]=6;
dice[4]=2;
dice[5]=4;

라고 하겠다. 그것을 표현하기 전이 주사위를 굴리기 전의 사진이다.
이것을 주사위를 굴렸을 때로 표현한 것이 동, 서, 남, 북의 이동이다.
사실 이것만으로도 이해를 확실하게 못하겠다면, 나처럼 주사위를 하나 만들어 보는 것도 추천한다.

집에 주사위가 있다면 좋겠지만, 주사위가 없어서 하나 만들어서 직접 굴려가면서 문제를 이해했다.

3. 풀이과정

  1. 6개짜리 주사위 배열 선언.
  2. 현재 위치를 저장할 y,x 변수에 이동방향으로 이동했는데 좌표를 넘어갔다면 다시 이전 y,x로 복구한뒤 return
  3. 좌표를 넘어가지 않았다면 주사위를 굴린다.
  4. 내가 지정한 주사위에서는 3번쨰 인덱스가 바닥을, 1번째 인덱스가 위를 향하고 있다. map[y][x] 가 0이라면 주사위 3번쨰 인덱스(바닥)의 숫자를 복사해온다.
  5. 아니라면 주사위 3번째 인덱스(바닥) 에 map[y][x]를 복사하고, map[y][x]는 0이 된다.
  6. 주사위를 굴릴 때마다 주사위의 1번째 인덱스 ( 위를 향하고 있음) 를 출력한다.

4. 소스코드

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

public class Main{

	static int dy[]= {-1,0,1,0};
	static int dx[]= {0,-1,0,1};
	static char dice[]=new char[6];
	static StringBuilder sb=new StringBuilder();
	static char map[][];
	static int y,x;
	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st;

		Arrays.fill(dice,'0');
		st=new StringTokenizer(br.readLine());
		int N=Integer.parseInt(st.nextToken());
		int M=Integer.parseInt(st.nextToken());
		y=Integer.parseInt(st.nextToken());
		x=Integer.parseInt(st.nextToken());
		int K=Integer.parseInt(st.nextToken());
	
		map=new char[N][M];
		for(int i=0;i<N;i++) {
			st=new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				map[i][j]=st.nextToken().charAt(0);
			}
		}
		st=new StringTokenizer(br.readLine());
		for(int i=0;i<K;i++) {
			int num=Integer.parseInt(st.nextToken());
			rollDice(num);
		}
		
		System.out.println(sb);
		
		
	}
	public static void rollDice(int num) {
		
		int prevY=y;
		int prevX=x;
		
		switch(num) {
		case 1: x++; break;
		case 2: x--; break; 
		case 3: y--; break;
		case 4: y++; break;
		}
		
		
		//범위 넘어가면 명령 무시
		if(y<0||x<0||y>=map.length||x>=map[0].length) {
			y=prevY;
			x=prevX;
			return;
		}
			
	
	
		char copyDice[]=dice.clone();
		
	
			
		switch(num) {
		case 1: 
			dice[1]= copyDice[4]; dice[3]= copyDice[5];
			dice[4]= copyDice[3]; dice[5]= copyDice[1];
			break;
		case 2:
			dice[1]= copyDice[5]; dice[3]= copyDice[4];
			dice[4]= copyDice[1]; dice[5]= copyDice[3];
			break;
		case 3:
			dice[0]= copyDice[1];	dice[1]= copyDice[2];
			dice[2]= copyDice[3];	dice[3]= copyDice[0];
			break;
		case 4:
			dice[0]= copyDice[3];	dice[1]= copyDice[0];
			dice[2]= copyDice[1];	dice[3]= copyDice[2];
			break;
		}
		if(map[y][x]=='0')
			map[y][x]=dice[3];
		else {
			dice[3]=map[y][x];
			map[y][x]='0';
		}
		
	
		sb.append(dice[1]).append('\n');
		
		
		
	}
	
}

5. 결과

6. 회고

이번 문제는 막상 맞닥뜨렸을 때에는 주사위를 굴리는 것을 어떻게 표현해야하나 막막해서 조금 힘들었는데, 막상 완전히 이 문제를 다 이해하고 나니 알차다고 생각한다. 재밌다.

사고력을 길러주는 문제가 아닐까 한다.

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람

0개의 댓글