알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 2116번: 주사위 쌓기

K.두부 2023. 1. 31. 22:09
반응형

https://www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

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

www.acmicpc.net

풀이

주사위 면은 총 6개, 주사위 개수는 최대 10,000개이므로 완전 탐색으로 진행해도 시간제한에 지장이 없다.

주사위 면을 A, B, C 대신 인덱스로 표현하면 아래와 같다.

 

위 문제의 조건은 아래층 주사위의 윗면과 위층 주사위의 아랫면의 숫자가 같아야한다.

 

가장 바닥에 올 수 있는 면은 6개의 면 중에서 한 개이므로 1-6까지 반복문을 돌리면서 찾아주면 된다.

아랫면이 정해지면 주사위 맞은 편인 윗면도 알 수 있다. 

public static int setTop (int idx) {
if (idx == 0) return 5;
else if (idx == 1) return 3;
else if (idx == 2) return 4;
else if (idx == 3) return 1;
else if (idx == 4) return 2;
else return 0;
}

i번째 층 주사위의 아랫면과 윗면을 알아냈으면 해당 면을 제외한 면 중에 최댓값을 찾으면 된다.

public static int findMax (int bot, int top) {
for (int i=6; i>0; i--) {
if (i != bot && i != top) {
return i;
}
}
return 0;
}

주사위의 제일 큰 값 6부터 내려가면서 찾아서 max 변수에 넣어줬다. 

 

<최종코드>

import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine()); // 주사위 개수
int[][] dice = new int[N][6];
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for (int j=0; j<6; j++) {
dice[i][j] = Integer.parseInt(st.nextToken());
}
}
int sum = 0;
int ans = 0;
for (int i=0; i<6; i++) {
int bot = dice[0][i]; // 아랫면
int top = dice[0][setTop(i)]; // 윗면
for (int d=0; d<N; d++) {
int max = 0;
// 주사위 윗면 찾기
for (int k=0; k<6; k++) {
if (dice[d][k] == top) {
bot = top;
top = dice[d][setTop(k)];
// 아랫면 윗면 제외하고 가장 큰 값 찾기
max = findMax(bot, top);
break;
}
}
sum += max;
}
ans = Math.max(ans, sum);
sum = 0;
}
System.out.println(ans);
}
public static int setTop (int idx) {
if (idx == 0) return 5;
else if (idx == 1) return 3;
else if (idx == 2) return 4;
else if (idx == 3) return 1;
else if (idx == 4) return 2;
else return 0;
}
public static int findMax (int bot, int top) {
for (int i=6; i>0; i--) {
if (i != bot && i != top) {
return i;
}
}
return 0;
}
}

 

 

 

 

반응형