본문 바로가기
코딩/백준-자바

[자바] 백준 14499번: 주사위 굴리기

by 철없는민물장어 2023. 2. 9.
728x90
반응형

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

 

어떠한 규칙이 있나? 찾아보려다가

주사위를 굴릴 때마다 주사위의 동서남북위아래가 어떻게 변하는지를 다 적어봤다.

 

그냥 하나하나 다 구현해놓는게 빠를것 같아서

주사위 class를 하나 만들고,

주사위 객체를 만들어 동서남북위아래에 적힌 숫자를 관리하는것이 좋을것 같았다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class P14499 {
	static class Dice {
		int top = 0;
		int bottom = 0;
		int east = 0;
		int west = 0;
		int south = 0;
		int north = 0;

		void roll_east() {
			int east = this.east;
			int west = this.west;
			int top = this.top;
			int bottom = this.bottom;

			this.bottom = east;
			this.top = west;
			this.east = top;
			this.west = bottom;
		}

		void roll_west() {
			int east = this.east;
			int west = this.west;
			int top = this.top;
			int bottom = this.bottom;

			this.top = east;
			this.bottom = west;
			this.west = top;
			this.east = bottom;
		}

		void roll_north() {

			int top = this.top;
			int bottom = this.bottom;
			int north = this.north;
			int south = this.south;

			this.top = south;
			this.bottom = north;
			this.north = top;
			this.south = bottom;
		}

		void roll_south() {

			int top = this.top;
			int bottom = this.bottom;
			int north = this.north;
			int south = this.south;

			this.top = north;
			this.bottom = south;
			this.north = bottom;
			this.south = top;
		}
	}

	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 r = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		int[][] 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());
			}
		}
		Dice dice = new Dice();
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < k; i++) {
			int roll = Integer.parseInt(st.nextToken());
			if (roll == 1) {
				// 동
				if (c >= m - 1)
					continue;
				c++;
				dice.roll_east();

			} else if (roll == 2) {
				// 서
				if (c <= 0)
					continue;
				c--;
				dice.roll_west();
			} else if (roll == 3) {
				// 북
				if (r <= 0)
					continue;
				r--;
				dice.roll_north();
			} else if (roll == 4) {
				// 남
				if (r >= n - 1)
					continue;
				r++;
				dice.roll_south();
			}

			if (map[r][c] == 0) {
				// 주사위 바닥값을 지도에 새김
				map[r][c] = dice.bottom;
			} else {
				// 주사위의 바닥값을 지도의 값으로 변경
				dice.bottom = map[r][c];
				map[r][c] = 0;
			}
			System.out.println(dice.top);
		}

	}

}

코드만 길고 풀이는 쉬웠던 주사위 문제.

728x90
반응형

댓글