반응형
2116번: 주사위 쌓기
첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는
www.acmicpc.net
풀이 )
가장 먼저 주사위의 마주보는 면을 짝 지어주기 위해 (0, 3), (1, 4), (2, 5) 인덱스에 각각 마주보는 면을 저장해주었다.
가장 바닥에 올 수 있는 면은 1번 주사위의 면 6개 중 하나이기 때문에 전체 6가지 답이 나올 수 있다.
각 주사위에 대해서 밑면의 숫자를 bottom, 윗면의 숫자를 top이라고 하면 이때 가장 큰 답이 나오기 위해서는 위, 아랫면을 제외한 4면 중 가장 큰 값을 선택하면 된다.
이 값을 구하기 위한 getSide( )메서드에서는
- bottom과 top이 각각 5와 6 또는 6과 5인 경우 (즉, 합이 13) 4를 반환
- bottom 또는 top이 6이고 나머지는 5 미만인 경우 5를 반환
- 그 이외의 경우에는 6을 반환한다.
이전 주사위의 윗면의 숫자와 일치하는 현재 주사위의 아랫면과 현재 주사위의 윗면을 제외한
나머지 현재 주사위의 옆면에 대해서도 같은 작업을 반복한다.
이렇게 구한 값 중 최댓값이 답이 된다.
(마주보는 면의 인덱스를 조건문 처리해주지 않기 위해 i와 (i+3)%6으로 구했다.)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] in;
int n = Integer.parseInt(br.readLine());
int[][] dice = new int[n][6];
for(int i = 0; i < n; ++i){
in = br.readLine().split(" ");
dice[i][0] = Integer.parseInt(in[0]);
dice[i][1] = Integer.parseInt(in[1]);
dice[i][2] = Integer.parseInt(in[2]);
dice[i][3] = Integer.parseInt(in[5]);
dice[i][4] = Integer.parseInt(in[3]);
dice[i][5] = Integer.parseInt(in[4]);
}
int max = 0;
for(int i = 0; i < 6; ++i){
int bottom = dice[0][i];
int top = dice[0][(i+3)%6];
int sum = getSide(bottom, top);
for(int j = 1; j < n; ++j){
for(int k = 0; k < 6; ++k){
if(dice[j][k] == top){
bottom = dice[j][k];
top = dice[j][(k+3)%6];
break;
}
}
sum += getSide(bottom, top);
}
max = Math.max(max, sum);
}
System.out.println(max);
}
public static int getSide(int bottom, int top){
if(bottom+top == 11)
return 4;
else if(bottom == 6 || top == 6)
return 5;
else
return 6;
}
}
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[JAVA] 백준 - 10026 : 적록색약 (0) | 2021.02.16 |
---|---|
[JAVA] 백준 - 10816 : 숫자카드2 (0) | 2021.02.16 |
[JAVA] 백준 - 14425 : 문자열 집합 (0) | 2021.02.13 |
[JAVA] 백준 - 13549 : 숨바꼭질3 (0) | 2021.02.13 |
[JAVA] 백준 - 5052 : 전화번호 목록 (0) | 2021.02.13 |