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

[백준]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;
    }
}

 

 

 

 

반응형