본문 바로가기
BaekJoon/Gold

[BOJ/JAVA] 백준 2116 : 주사위 쌓기 (자바)

by HoonSikE 2022. 3. 26.
반응형
SMALL
문제 정보
  문제명   - 주사위 쌓기
  난이도   - 골드 IV
문제 번호 - 2116번

문제 링크

BOJ_G4_2116_주사위_쌓기

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net


문제
천수는 여러 종류의 주사위를 가지고 쌓기 놀이를 하고 있다. 주사위의 모양은 모두 크기가 같은 정육면체이며 각 면에는 1부터 6까지의 숫자가 하나씩 적혀있다. 그러나 보통 주사위처럼 마주 보는 면에 적혀진 숫자의 합이 반드시 7이 되는 것은 아니다.
주사위 쌓기 놀이는 아래에서부터 1번 주사위, 2번 주사위, 3번 주사위, … 의 순서로 쌓는 것이다. 쌓을 때 다음과 같은 규칙을 지켜야 한다: 서로 붙어 있는 두 개의 주사위에서 아래에 있는 주사위의 윗면에 적혀있는 숫자는 위에 있는 주사위의 아랫면에 적혀있는 숫자와 같아야 한다. 다시 말해서, 1번 주사위 윗면의 숫자는 2번 주사위 아랫면의 숫자와 같고, 2번 주사위 윗면의 숫자는 3번 주사위 아랫면의 숫자와 같아야 한다. 단, 1번 주사위는 마음대로 놓을 수 있다.
이렇게 쌓아 놓으면 긴 사각 기둥이 된다. 이 사각 기둥에는 4개의 긴 옆면이 있다. 이 4개의 옆면 중에서 어느 한 면의 숫자의 합이 최대가 되도록 주사위를 쌓고자 한다. 이렇게 하기 위하여 각 주사위를 위 아래를 고정한 채 옆으로 90도, 180도, 또는 270도 돌릴 수 있다. 한 옆면의 숫자의 합의 최댓값을 구하는 프로그램을 작성하시오.
[그림 1]

입력
첫줄에는 주사위의 개수가 입력된다.
그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다.
주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는 주사위의 전개도에서 A, B, C, D, E, F 의 순서로 입력된다. 입력되는 숫자 사이에는 빈 칸이 하나씩 있다. 주사위의 개수는 10,000개 이하이며 종류가 같은 주사위도 있을 수 있다.

출력
첫줄에 한 옆면의 숫자의 합이 가장 큰 값을 출력한다.

예제 출력
예제 입력 예제 출력
5
2 3 1 6 5 4
3 1 2 4 6 5
5 6 4 1 3 2
1 3 6 2 4 5
4 1 6 5 2 3
29

힌트

알고리즘 분류
● 구현
브루트포스 알고리즘

소스코드
package Lv3_Gold;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
 * @author HanHoon
 * @category 구현, 브루트포스 알고리즘
 * https://www.acmicpc.net/problem/2116
 */
public class BOJ_G4_2116_주사위_쌓기 {
	static int N, result;
	public static void getDice(int[][] tmp, int num) {
		int sum = 0;
		int tmp_num = num;
		// 이전 주사위윗면 == 다음 주사위 아랫면인 부분을 찾음
		for (int n = 0; n < tmp.length; n++) {
			for (int m = 0; m < tmp[n].length; m++) {
				if(tmp[n][m] == tmp_num) {
					int index = m;
					// 아랫면 값 0으로 바꿔줌
					tmp[n][index] = 0;
					// 반대편 값 index에 저장
					switch(index) {
					// A -> F
					case 0: index = 5; break;
					// B -> D
					case 1: index = 3; break;
					// C -> E
					case 2: index = 4; break;
					// D -> B
					case 3: index = 1; break;
					// E -> C
					case 4: index = 2; break;
					// F -> A
					case 5: index = 0; break;
					}
					// tmp_num값을 윗면으로 바꿈
					tmp_num = tmp[n][index];
					// 윗면값 0으로 바꿔줌
					tmp[n][index] = 0;
					break;
				}
			}
		}
		for (int[] di : tmp) {
			int max = Integer.MIN_VALUE;
			// 주사위별 옆 면 최대값을 구함
			for (int n : di) {
				max = max < n ? n : max;
			}
			sum += max;
		}
		// 최대값 최신화
		result = result < sum ? sum : result;
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		// 주사위 개수
		N = Integer.parseInt(br.readLine());
		int[][] dice = new int[N][6];
		result = 0;
		for (int i = 0; i < N; i++) {
			/* 주사위 모양이 아래와 같이 A B C D E F 순으로 입력
			 * 	 A
			 * B C D E
			 *   F
			 */
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < 6; j++) {
				dice[i][j] = Integer.parseInt(st.nextToken()); 
			}
		}
		// 밑면이 1인경우 ~ 6인경우 까지 경우의 수
		for (int i = 0; i < 6; i++) {
			int[][] tmp = new int[N][6];
			for (int n = 0; n < tmp.length; n++)
				for (int m = 0; m < tmp[n].length; m++)
					tmp[n][m] = dice[n][m];
			getDice(tmp, i+1);
		}
		
		System.out.println(result);
		br.close();
	}
}

 


BaekJoon List
 

BaekJoon List

BOJ Start!! ● [BOJ] 백준 회원가입, 시작하는 법 ● [BOJ] 등급(티어) 및 Solved.AC 적용 ● [BOJ/JAVA] 백준 소스코드 제출 시 유의사항(자바) Bronze ● Bronze V  - ● Bronze IV  - ● Bronze III  -..

han-hoon.tistory.com


  

기회는 준비된 자에게 찾아온다.

 


 

반응형
LIST

댓글