๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽฏPS - Baekjoon, etc/๊ตฌํ˜„

๐Ÿฅ‡[๋ฐฑ์ค€, 2116] ์ฃผ์‚ฌ์œ„ ์Œ“๊ธฐ (Java)

by hyeon-z 2023. 4. 3.

 

๋ฌธ์ œ ๋งํฌ

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

 

2116๋ฒˆ: ์ฃผ์‚ฌ์œ„ ์Œ“๊ธฐ

์ฒซ์ค„์—๋Š” ์ฃผ์‚ฌ์œ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์‚ฌ์œ„์˜ ์ข…๋ฅ˜๊ฐ€ 1๋ฒˆ ์ฃผ์‚ฌ์œ„๋ถ€ํ„ฐ ์ฃผ์‚ฌ์œ„ ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅ๋œ๋‹ค. ์ฃผ์‚ฌ์œ„์˜ ์ข…๋ฅ˜๋Š” ๊ฐ ๋ฉด์— ์ ํ˜€์ง„ ์ˆซ์ž๊ฐ€ ๊ทธ๋ฆผ1์— ์žˆ๋Š”

www.acmicpc.net

 

๋‚œ์ด๋„

 

์‹œ๊ฐ„์ œํ•œ

2์ดˆ

 

๋ฌธ์ œ

์ฒœ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ฃผ์‚ฌ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์Œ“๊ธฐ ๋†€์ด๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ์ฃผ์‚ฌ์œ„์˜ ๋ชจ์–‘์€ ๋ชจ๋‘ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ์ •์œก๋ฉด์ฒด์ด๋ฉฐ ๊ฐ ๋ฉด์—๋Š” 1๋ถ€ํ„ฐ 6๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•˜๋‚˜์”ฉ ์ ํ˜€์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณดํ†ต ์ฃผ์‚ฌ์œ„์ฒ˜๋Ÿผ ๋งˆ์ฃผ ๋ณด๋Š” ๋ฉด์— ์ ํžŒ ์ˆซ์ž์˜ ํ•ฉ์ด ๋ฐ˜๋“œ์‹œ 7์ด ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

์ฃผ์‚ฌ์œ„ ์Œ“๊ธฐ ๋†€์ด๋Š” ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ 1๋ฒˆ ์ฃผ์‚ฌ์œ„, 2๋ฒˆ ์ฃผ์‚ฌ์œ„, 3๋ฒˆ ์ฃผ์‚ฌ์œ„, โ€ฆ ์˜ ์ˆœ์„œ๋กœ ์Œ“๋Š” ๊ฒƒ์ด๋‹ค. ์Œ“์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค: ์„œ๋กœ ๋ถ™์–ด ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ฃผ์‚ฌ์œ„์—์„œ ์•„๋ž˜์— ์žˆ๋Š” ์ฃผ์‚ฌ์œ„์˜ ์œ—๋ฉด์— ์ ํ˜€์žˆ๋Š” ์ˆซ์ž๋Š” ์œ„์— ์žˆ๋Š” ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์— ์ ํ˜€์žˆ๋Š” ์ˆซ์ž์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ, 1๋ฒˆ ์ฃผ์‚ฌ์œ„ ์œ—๋ฉด์˜ ์ˆซ์ž๋Š” 2๋ฒˆ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด์˜ ์ˆซ์ž์™€ ๊ฐ™๊ณ , 2๋ฒˆ ์ฃผ์‚ฌ์œ„ ์œ—๋ฉด์˜ ์ˆซ์ž๋Š” 3๋ฒˆ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด์˜ ์ˆซ์ž์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๋‹จ, 1๋ฒˆ ์ฃผ์‚ฌ์œ„๋Š” ๋งˆ์Œ๋Œ€๋กœ ๋†“์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์Œ“์•„ ๋†“์œผ๋ฉด ๊ธด ์‚ฌ๊ฐ๊ธฐ๋‘ฅ์ด ๋œ๋‹ค. ์ด ์‚ฌ๊ฐ๊ธฐ๋‘ฅ์—๋Š” 4๊ฐœ์˜ ๊ธด ์˜†๋ฉด์ด ์žˆ๋‹ค. ์ด 4๊ฐœ์˜ ์˜†๋ฉด ์ค‘์—์„œ ์–ด๋А ํ•œ ๋ฉด์˜ ์ˆซ์ž์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ์ฃผ์‚ฌ์œ„๋ฅผ ์Œ“๊ณ ์ž ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฐ ์ฃผ์‚ฌ์œ„๋ฅผ ์œ„์•„๋ž˜๋ฅผ ๊ณ ์ •ํ•œ ์ฑ„ ์˜†์œผ๋กœ 90๋„, 180๋„, ๋˜๋Š” 270๋„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํ•œ ์˜†๋ฉด์˜ ์ˆซ์ž์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์ค„์—๋Š” ์ฃผ์‚ฌ์œ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๊ทธ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์‚ฌ์œ„์˜ ์ข…๋ฅ˜๊ฐ€ 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

 


๋ฌธ์ œ ํ’€์ด ๊ณผ์ •

 ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ

 

๋จผ์ € ์ฃผ์‚ฌ์œ„ ๊ทธ๋ฆผ 1์„ ์‚ดํŽด๋ณด์ž.

A์˜ ๋ฐ˜๋Œ€ ํŽธ์—๋Š” F, B์˜ ๋ฐ˜๋Œ€ํŽธ์—๋Š” D, C์˜ ๋ฐ˜๋Œ€ํŽธ์—๋Š” E๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ง์„ ๋งž์ถฐ๋ณด๋ฉด A-F, B-D, C-E์ด๋‹ค.

 

โ“๋งค๋ฒˆ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋ฉด ๊ณผ์—ฐ ์ฃผ์‚ฌ์œ„ ์˜†๋ฉด์˜ ์ˆซ์ž์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‹ต์€ "์•„๋‹ˆ๋‹ค"์ด๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์—์„œ ์•„๋žซ๋ฉด์œผ๋กœ 1, ์ฆ‰ ์ตœ์†Œ์˜ ์ˆ˜๋ฅผ ์„ ํƒํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ๊ทธ์™€ ์ง์ธ ์ˆ˜๊ฐ€ 6์œผ๋กœ ์ตœ๋Œ€์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์„ 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ๊ณ ์ •์‹œ์ผœ ๊ฐ€๋ฉฐ ํ•ด๋‹น ๊ฒฝ์šฐ์— ๋”ฐ๋ฅธ ์˜† ๋ฉด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ ๋‹ค์Œ ๊ทธ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

 

์ž…๋ ฅ๊ฐ’ ์ €์žฅํ•˜๊ธฐ

 

public class BOJ_2116 {
    static int[][] dice;
    static final int diceCount = 6;
    static int[] diceMatch = {5, 3, 4, 1, 2, 0};  // A-F, B-D, C-E

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        dice = new int[N][diceCount];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < diceCount; j++) {
                dice[i][j] = Integer.parseInt(st.nextToken());
            }
        }
    }
}

 

์œ„์—์„œ ์‚ดํŽด๋ดค๋˜ A-F, B-D, C-E๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ‘œํ˜„ํ•˜๋ฉด 0-5, 1-3, 2-4๊ฐ€ ๋˜์–ด dicMatch๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

๊ทธ ํ›„ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ฃผ์‚ฌ์œ„์˜ ์ •๋ณด๋ฅผ dice๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

 

 ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์„ 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ๊ณ ์ •์‹œํ‚ค๋ฉฐ ํ•ด๋‹น ๊ฒฝ์šฐ ์‚ดํŽด๋ณด๊ธฐ

 

int result = 0;

for (int i = 0; i < diceCount; i++) {
    int bottom = dice[0][i];
    ...

    for (int j = 1; j < N; j++) {
        ...
    }

    result = Math.max(totalMax, result);
}

 

for๋ฌธ์„ ๋Œ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์„ ๊ณ ์ •์‹œํ‚จ๋‹ค.

 

โ“๊ทธ๋‹ค์Œ์œผ๋กœ๋Š” ์–ด๋–ค ์ผ์„ ํ•ด์•ผ ํ• ๊นŒ?

1. ํ•ด๋‹น ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์— ๋”ฐ๋ฅธ ๋‹ค์Œ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์˜ index๋ฅผ ๊ตฌํ•œ๋‹ค.

2. ๋‹ค์Œ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด์˜ index๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ฃผ์‚ฌ์œ„์˜ ์œ—๋ฉด์˜ index์™€ ์•„๋žซ๋ฉด์˜ index๋ฅผ ์ œ์™ธํ•œ index๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜์—ฌ ์˜†๋ฉด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

 

์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์„ ๊ณ ์ •์‹œํ‚ค๋ฉด ๋‹ค์Œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค์Œ ์ฃผ์‚ฌ์œ„์˜ ์œ—๋ฉด๊ณผ ์•„๋žซ๋ฉด์€ ์ •ํ•ด์ง€๊ฒŒ ๋œ๋‹ค.

์„œ๋กœ ๋ถ™์–ด ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ฃผ์‚ฌ์œ„์—์„œ ์•„๋ž˜์— ์žˆ๋Š” ์ฃผ์‚ฌ์œ„์˜ ์œ—๋ฉด์— ์ ํ˜€์žˆ๋Š” ์ˆซ์ž๋Š” ์œ„์— ์žˆ๋Š” ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์— ์ ํ˜€์žˆ๋Š” ์ˆซ์ž์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

 

๋˜ํ•œ ๋ฌธ์ œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ„์•„๋ž˜๋ฅผ ๊ณ ์ •ํ•œ ์ฑ„ ์˜†์œผ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฏ€๋กœ ๋งค ์ฃผ์‚ฌ์œ„๋งˆ๋‹ค ์œ—๋ฉด๊ณผ ์•„๋žซ๋ฉด์„ ์ œ์™ธํ•œ ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์œผ๋ฉฐ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฐ ์ฃผ์‚ฌ์œ„๋ฅผ ์œ„์•„๋ž˜๋ฅผ ๊ณ ์ •ํ•œ ์ฑ„ ์˜†์œผ๋กœ 90๋„, 180๋„, ๋˜๋Š” 270๋„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. 

 

index+1๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด ์ˆซ์ž๋กœ ๋‹ค์Œ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด index ์ฐพ๊ธฐ

 

static int findNextBottomIndex(int index, int bottom) {
    int nBottomIndex = 0;

    for (int i = 0; i < diceCount; i++) {
        if (dice[index][i] == bottom) {
            nBottomIndex = diceMatch[i];
            break;
        }
    }

    return nBottomIndex;
}

 

์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์€ ๊ณ ์ •์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ฃผ์‚ฌ์œ„๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ์ฃผ์‚ฌ์œ„์˜ 6๋ฉด์„ ์‚ดํŽด๋ณด๊ณ  bottom๊ณผ ๊ฐ™์€ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ํ•ด๋‹น ์ฃผ์‚ฌ์œ„์˜ ์œ—๋ฉด์˜ index๋ฅผ ์•Œ๊ฒŒ ๋œ๋‹ค. diceMatch๋ฐฐ์—ด์„ ํ†ตํ•ด ํ•ด๋‹น ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด index๋ฅผ ์ฐพ์€ ํ›„ return ํ•œ๋‹ค.

 

์•„๋žซ๋ฉด index๋ฅผ ํ†ตํ•ด ์˜†๋ฉด์˜ ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ

 

static int findMax(int index, int bottomIndex) {
    int max = 0;

    for (int i = 0; i < diceCount; i++) {
        if (i == bottomIndex || i == diceMatch[bottomIndex]) {
            continue;
        }
        if (max < dice[index][i]) {
            max = dice[index][i];
        }
    }

    return max;
}

 

ํ•ด๋‹น ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด๊ณผ ์œ—๋ฉด์˜ index๋ฅผ ์ œ์™ธํ•œ ๊ฐ’ ์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„๋‚ด๊ณ  ์ด๋ฅผ return ํ•œ๋‹ค.

 

์ตœ์ข… ์ฝ”๋“œ

 

public class BOJ_2116 {
    static int[][] dice;
    static final int diceCount = 6;
    static int[] diceMatch = {5, 3, 4, 1, 2, 0};  // A-F, B-D, C-E

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        dice = new int[N][diceCount];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < diceCount; j++) {
                dice[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int result = 0;

        for (int i = 0; i < diceCount; i++) {
            int bottom = dice[0][i];
            int totalMax = findMax(0, i);

            for (int j = 1; j < N; j++) {
                int nBottomIndex = findNextBottomIndex(j, bottom);
                totalMax += findMax(j, nBottomIndex);
                bottom = dice[j][nBottomIndex];
            }

            result = Math.max(totalMax, result);
        }

        System.out.println(result);
    }

    // index+1๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด ์ˆซ์ž๋กœ ๋‹ค์Œ ์ฃผ์‚ฌ์œ„ ์•„๋žซ๋ฉด index ์ฐพ๊ธฐ
    static int findNextBottomIndex(int index, int bottom) {
        int nBottomIndex = 0;

        for (int i = 0; i < diceCount; i++) {
            if (dice[index][i] == bottom) {
                nBottomIndex = diceMatch[i];
                break;
            }
        }

        return nBottomIndex;
    }

    static int findMax(int index, int bottomIndex) {
        int max = 0;

        for (int i = 0; i < diceCount; i++) {
            if (i == bottomIndex || i == diceMatch[bottomIndex]) {
                continue;
            }
            if (max < dice[index][i]) {
                max = dice[index][i];
            }
        }

        return max;
    }
}

 ์ฒซ ๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ์•„๋žซ๋ฉด์„ 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ๊ณ ์ •์‹œํ‚ค๋ฉฐ ์˜† ๋ฉด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ ๋’ค ๊ทธ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋Œ“๊ธ€