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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

BOJ - 큐빙 5373번 (JAVA)
알고리즘/알고리즘문풀

BOJ - 큐빙 5373번 (JAVA)

2022. 4. 22. 03:15

❓ 문제 - 백준 큐빙 5373번 - JAVA 풀이법

출처 

(https://www.acmicpc.net/problem/5373)

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다. (아주 빡구현 ^^..ㅎ)

  • 각 면 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면에 색깔 값을 2차원배열로 관리하며 돌린다.
  • 돌리라는 면과 방향(시계 or 반시계)에 맞춰 함수를 돌려준다. -> 영향받는 다른 면들 상태 변경
  • 그리고 해당면을 방향(시계 or 반시계)에 맞춰 90도 돌리는 함수도 돌려준다.
  • 각 면에 맞는 2차원 배열을 관리 할 때 바라보는 방향에 맞춰 열과 행을 관리할 수 있도록 한다.
  • 밑에 각 면에 파란 부분은 해당 면을 돌리면 영향받는 부분을 표시한 것이다.

 

 

2. 돌리는 함수

 1) 윗면 돌리기

  • 시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다.
  • 반시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다. 

 2) 바닥면 돌리기

  • 시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다.
  • 반시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다. 

 3) 앞면 돌리기

  • 시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다. 

 4) 뒷면 돌리기

  • 시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다. 

 5) 왼쪽면 돌리기

  • 시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다. 

 6) 오른쪽면 돌리기

  • 시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다. 

 

3. 느낀점

  • 4시간 이상은 걸린 .. ㅎㅎ 
  • 제발 ! 자바 값 복사할 때 clone 쓰거나 그대로 값 넣어주자...
  • 자바는... 얕은 복사의 경우 조심하자...........

 

💻 소스코드

// BOJ - 큐빙(5373번)
// 구현

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

public class Main_5373 {

	public static char[][] up;
	public static char[][] down;
	public static char[][] front;
	public static char[][] back;
	public static char[][] left;
	public static char[][] right;
	
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		for(int test_case=1;test_case<=TC;test_case++) {
			int n = Integer.parseInt(br.readLine());
			String[] data = br.readLine().split(" ");
			up = new char[][]{{'w', 'w', 'w'}, {'w', 'w', 'w'}, {'w', 'w', 'w'}};
			down = new char[][]{{'y', 'y', 'y'}, {'y', 'y', 'y'}, {'y', 'y', 'y'}};
			front = new char[][]{{'r', 'r', 'r'}, {'r', 'r', 'r'}, {'r', 'r', 'r'}};
			back = new char[][]{{'o', 'o', 'o'}, {'o', 'o', 'o'}, {'o', 'o', 'o'}};
			left = new char[][]{{'g', 'g', 'g'}, {'g', 'g', 'g'}, {'g', 'g', 'g'}};
			right = new char[][]{{'b', 'b', 'b'}, {'b', 'b', 'b'}, {'b', 'b', 'b'}};
			
			for(int i=0;i<n;i++) {
				String str = data[i];
				char move = str.charAt(0);
				char dir = str.charAt(1);
				if(move == 'U') {
					rotate_U(dir);
				} else if(move == 'D') {
					rotate_D(dir);
				} else if(move == 'F') {
					rotate_F(dir);
				} else if(move == 'B') {
					rotate_B(dir);
				} else if(move == 'L') {
					rotate_L(dir);
				} else if(move == 'R') {
					rotate_R(dir);
				}
				
				
			}
					
			for(int i=0;i<3;i++) {
				for(int j=0;j<3;j++) {
					sb.append(up[i][j]);
				}
				sb.append("\n");
			}
		}
		System.out.println(sb.toString());
	}
	
	public static void rotate_U(char dir) {
		
		if(dir == '+') {
			up = rotate1(up);
			char[] temp = back[0];
			back[0] = left[0];
			left[0] = front[0];
			front[0] = right[0];
			right[0] = temp;

			// 뒷 - 오 - 앞 - 왼 - 뒷
			
		} else {

			up = rotate2(up);
			// 뒷 - 왼 - 앞 - 오 - 뒷 
			char[] temp = back[0].clone();
			back[0] = right[0].clone();
			right[0] = front[0].clone();
			front[0] = left[0].clone();
			left[0] = temp;
		}
	}
	
	public static void rotate_D(char dir) {
		if(dir == '+') {
			down = rotate1(down);
			// 뒷 - 왼 - 앞 - 오 - 뒷 
			char[] temp = back[2].clone();
			back[2] = right[2].clone();
			right[2] = front[2].clone();
			front[2] = left[2].clone();
			left[2] = temp;
		} else {
			down = rotate2(down);
			// 뒷 - 오 - 앞 - 왼 - 뒷
			char[] temp = back[2].clone();
			back[2] = left[2].clone();
			left[2] = front[2].clone();
			front[2] = right[2].clone();
			right[2] = temp;
		}
	}
	
	public static void rotate_F(char dir) {
		if(dir == '+') {
			front = rotate1(front);
			// 윗 - 오 - 바 - 왼 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2][i];
			}
			
			for(int i=0;i<3;i++) {
				up[2][i] = left[2-i][2];
			}

			for(int i=0;i<3;i++) {
				left[i][2] = down[2][2-i];
			}
			
			for(int i=0;i<3;i++) {
				down[2][i] = right[i][0];
			}
			
			for(int i=0;i<3;i++) {
				right[i][0] = temp[i];
			}
			
			
			
		} else {
			front = rotate2(front);
			// 윗 - 왼 - 바 - 오 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2][2-i];
			}
	
			for(int i=0;i<3;i++) {
				up[2][i] = right[i][0];
			}

			for(int i=0;i<3;i++) {
				right[i][0] = down[2][i];
			}
			

			for(int i=0;i<3;i++) {
				down[2][i] = left[2-i][2];
			}

			for(int i=0;i<3;i++) {
				left[i][2] = temp[i];
			}
			
		}
	}
	
	public static void rotate_B(char dir) {
		if(dir == '+') {
			back = rotate1(back);
			// 윗 - 왼 - 바 - 오 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[0][2-i];
			}
			for(int i=0;i<3;i++) {
				up[0][i] = right[i][2];
			}
			for(int i=0;i<3;i++) {
				right[i][2] = down[0][i];
			}
			for(int i=0;i<3;i++) {
				down[0][i] = left[2-i][0];
			}
			for(int i=0;i<3;i++) {
				left[i][0] = temp[i];
			}
			
		} else {
			back = rotate2(back);
			// 윗 - 오 - 바 - 왼 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[0][i];
			}

			for(int i=0;i<3;i++) {
				up[0][i] = left[2-i][0];
			}
			for(int i=0;i<3;i++) {
				left[i][0] = down[0][2-i];
			}
			for(int i=0;i<3;i++) {
				down[0][i] = right[i][2];
			}
			for(int i=0;i<3;i++) {
				right[i][2] = temp[i];
			}
		}
	}
	
	public static void rotate_L(char dir) {
		if(dir == '+') {
			left = rotate1(left);
			// 윗 - 앞 - 바 - 뒷 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[i][0];
			}
			for(int i=0;i<3;i++) {
				up[i][0] = back[2-i][2];
			}
			for(int i=0;i<3;i++) {
				back[i][2] = down[i][2];
			}
			for(int i=0;i<3;i++) {
				down[i][2] = front[2-i][0];
			}
			for(int i=0;i<3;i++) {
				front[i][0] = temp[i];
			}
		} else {
			left = rotate2(left);
			// 윗 - 뒷 - 바 - 앞  - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2-i][0];
			}
			for(int i=0;i<3;i++) {
				up[i][0] = front[i][0];
			}
			for(int i=0;i<3;i++) {
				front[i][0] = down[2-i][2];
			}
			for(int i=0;i<3;i++) {
				down[i][2] = back[i][2];
			}
			for(int i=0;i<3;i++) {
				back[i][2] = temp[i];
			}
		}
	}
	
	public static void rotate_R(char dir) {
		if(dir == '+') {
			right = rotate1(right);
			// 윗 - 뒷 - 바 - 앞  - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2-i][2];
			}
			for(int i=0;i<3;i++) {
				up[i][2] = front[i][2];
			}
			for(int i=0;i<3;i++) {
				front[i][2] = down[2-i][0];
			}
			for(int i=0;i<3;i++) {
				down[i][0] = back[i][0];
			}
			for(int i=0;i<3;i++) {
				back[i][0] = temp[i];
			}
		} else {
			right = rotate2(right);
			// 윗 - 앞 - 바 - 뒷 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[i][2];
			}
			for(int i=0;i<3;i++) {
				up[i][2] = back[2-i][0];
			}
			for(int i=0;i<3;i++) {
				back[i][0] = down[i][0];
			}
			for(int i=0;i<3;i++) {
				down[i][0] = front[2-i][2];
			}
			for(int i=0;i<3;i++) {
				front[i][2] = temp[i];
			}
		}
	}
	
	// 시계방향으로 90도 회전
	public static char[][] rotate1(char[][] arr) {
		char[][] rotate = new char[3][3];
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				rotate[i][j] = arr[3-1-j][i];
			}
		}
		
		return rotate;
	}
	
	// 반시계 방향으로 90도 회전
	public static char[][] rotate2(char[][] arr) {
		char[][] rotate = new char[3][3];
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				rotate[i][j] = arr[j][3-1-i];
			}
		}
		
		return rotate;
	}
	



}

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

BOJ - 인구 이동 16234번 (JAVA)  (0) 2022.04.29
BOJ - 나무 재테크 16235번 (JAVA)  (0) 2022.04.22
BOJ - 드래곤 커브 15685번 (JAVA)  (0) 2022.04.21
BOJ - 사다리 조작 15684번 (JAVA)  (0) 2022.04.21
BOJ - 감시 15683번 (Java)  (0) 2022.04.21
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 인구 이동 16234번 (JAVA)
    • BOJ - 나무 재테크 16235번 (JAVA)
    • BOJ - 드래곤 커브 15685번 (JAVA)
    • BOJ - 사다리 조작 15684번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바