developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++ 빌더 패턴
  • 카카오코테
  • SW역량테스트파이썬풀이
  • 시계열
  • 시계열분석
  • 데이터분석
  • ARIMA모형
  • SW역량테스트파이썬
  • 삼성코테기출
  • 백준파이썬풀이
  • 통계학
  • c++디자인패턴
  • 삼성코테기출자바풀이
  • 삼성코테구현풀이
  • 삼성코테파이썬풀이
  • 카카오코테java풀이
  • MA모형
  • AR모형
  • 삼성코테자바풀이
  • 코테파이썬
  • 통계분석
  • 삼성코테파이썬
  • Arima
  • 삼성코테구현문제추천
  • 삼성코테파이썬준비
  • BOJ파이썬풀이
  • 삼성코테준비
  • 운영체제인터럽트
  • 삼성코테자바준비
  • 삼성코테자바꿀팁

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 주사위 굴리기 14499번 (JAVA)

2022. 4. 11. 13:28

❓ 문제 - 백준 주사위 굴리기 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

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다.

  • 주사위의 윗면 - 바닥면 - 앞면 - 뒷면 - 왼쪽면 - 오른쪽면에 대한 값들을 dice 배열을 통해 저장
  • 지도의 값을  map를 통해 저장한다.
  • 주사위를 움직일 때 dx, dy(동-0, 서-1, 북-2, 남-3)를 이용해서 움직이려는 곳이 지도 밖이면 움직이지 않게 한다.
  • 주사위를 움직일 때 동,서,북,남 방향에 맞춰서 move_right(), move_left(), move_up(), move_down() 함수를 호출하여 주사위를 해당 방향으로 움직인다.
  • 만약 움직였을 때 해당 지도의 값이 0이면 주사위의 바닥면(dice[1])의 값을 지도에 복사한다.
  • 만약 움직였을 때 해당 지도의 값이 0이 아니면 바닥면(dice[1])에 지도의 값을 복사한 후 지도 값을 0으로 변경한다.

2. 주사위 굴림 구현

  • move_right() : 주사위 동쪽으로 굴리면 주사위의 값들이 윗 -> 오 -> 바닥 -> 왼 -> 윗 으로 이동하는 것을 구현한다.
  • move_left() : 주사위 서쪽으로 굴리면 주사위의 값들이 윗 -> 왼 -> 바 -> 오 -> 윗 으로 이동하는 것을 구현한다.
  • move_up() : 주사위 북쪽으로 굴리면 주사위의 값들이 윗 -> 뒷 -> 바 -> 앞 -> 윗 으로 이동하는 것을 구현한다.
  • move_down() : 주사위 남쪽으로 굴리면 주사위의 값들이 윗 -> 앞 -> 바 -> 뒷 -> 윗 으로 이동하는 것을 구현한다.

3. 느낀점

  • 저번에 풀었던 파이썬 방식과 유사하게 빡구현으로 이동 방향에 맞춰 다 구현해줬다.
  • 혹시나 다른 사람들의 풀이를 참고했지만 다 이런식으로 구현하신듯하다...!

 

 

💻 소스코드

// BOJ - 주사위 굴리기(14499번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_14499 {
	public static int n, m, x, y, k;
	public static int[][] map;
	// 동, 서, 북, 남
	public static int[] dx = {0, 0, -1, 1};
	public static int[] dy = {1, -1, 0, 0};
	// 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면
	public 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));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		x = Integer.parseInt(st.nextToken());
		y = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		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());
			}
		}
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i=0;i<k;i++) {
			int move = Integer.parseInt(st.nextToken()) - 1;
			x += dx[move];
			y += dy[move];
			if(x < 0 || x >= n || y < 0 || y >= m) {
				x -= dx[move];
				y -= dy[move];
				continue;
			}

			switch(move) {
			case 0:
				move_right();
				break;
			case 1:
				move_left();
				break;
			case 2:
				move_up();
				break;
			case 3:
				move_down();
				break;
			}
			// 바닥면 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[1];
			} else {
				dice[1] = map[x][y];
				map[x][y] = 0;
			}
			
			System.out.println(dice[0]);
		}
		
	
	}
	
	public static void move_right() {
		// 윗 -> 오 -> 바닥 -> 왼 -> 윗
		int temp = dice[0];
		dice[0] = dice[4];
		dice[4] = dice[1];
		dice[1] = dice[5];
		dice[5] = temp;
		
	}
	
	public static void move_left() {
		// 윗 -> 왼 -> 바 -> 오 -> 윗
		int temp = dice[0];
		dice[0] = dice[5];
		dice[5] = dice[1];
		dice[1] = dice[4];
		dice[4] = temp;
		
	}
	
	public static void move_up() {
		// 윗 -> 뒷 -> 바 -> 앞 -> 윗
		int temp = dice[0];
		dice[0] = dice[2];
		dice[2] = dice[1];
		dice[1] = dice[3];
		dice[3] = temp;
		
	}
	
	public static void move_down() {
		// 윗 -> 앞 -> 바 -> 뒷 -> 윗
		int temp = dice[0];
		dice[0] = dice[3];
		dice[3] = dice[1];
		dice[1] = dice[2];
		dice[2] = temp;
		
	}

}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 로봇 청소기 14503번 (JAVA)  (0) 2022.04.17
BOJ - 테트로미노 14500번 (JAVA)  (0) 2022.04.12
BOJ - 시험 감독 13485번 (JAVA)  (0) 2022.04.08
BOJ - 뱀 3190번 (JAVA)  (0) 2022.04.08
BOJ - 연구소 14502번 (JAVA)  (0) 2022.04.08
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 로봇 청소기 14503번 (JAVA)
    • BOJ - 테트로미노 14500번 (JAVA)
    • BOJ - 시험 감독 13485번 (JAVA)
    • BOJ - 뱀 3190번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바