Post

[Programmers] #181916 - 주사위 게임 3 [Java][C++][Python]

네 주사위 눈의 조합 패턴에 따라 분기 처리해 점수를 구하는 문제.

[Programmers] #181916 - 주사위 게임 3 [Java][C++][Python]

문제 링크


1. 아이디어

a, b, c, d 네 값이 얼마나 겹치는지에 따라 점수 계산식이 다르므로, 겹치는 값이 많은 경우부터 순서대로 조건을 검사해 분기 처리하는 문제다. 네 값이 모두 같은 경우, 세 값만 같은 경우, 두 쌍(2+2)이 같은 경우, 정확히 한 쌍만 같은 경우, 모두 다른 경우 순으로 검사해야 한다. 이 순서가 중요한데, 예를 들어 a == b이면서 c == d인 두 쌍 조합을 먼저 걸러내지 않고 a == b만으로 판단하면 두 쌍이 같은 경우까지 “한 쌍만 같음” 분기로 잘못 빠지게 된다. 따라서 겹침이 많은 조건일수록 먼저 검사하는 순서 자체가 이 문제의 핵심이다.


2. 복잡도

접근시간공간
풀이$O(1)$$O(1)$

3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
    public int solution(int a, int b, int c, int d) {
        if (a == b && b == c && c == d) {
            return 1111 * a;
        } else if (b == c && c == d) {
            return (10 * b + a) * (10 * b + a);
        } else if (c == d && d == a) {
            return (10 * c + b) * (10 * c + b);
        } else if (d == a && a == b) {
            return (10 * d + c) * (10 * d + c);
        } else if (a == b && b == c) {
            return (10 * a + d) * (10 * a + d);
        } else if (a == b && c == d) {
            return (a + c) * Math.abs(a - c);
        } else if (a == c && b == d) {
            return (a + b) * Math.abs(a - b);
        } else if (a == d && b == c) {
            return (a + b) * Math.abs(a - b);
        } else if (a == b) {
            return c * d;
        } else if (a == c) {
            return b * d;
        } else if (a == d) {
            return b * c;
        } else if (b == c) {
            return a * d;
        } else if (b == d) {
            return a * c;
        } else if (c == d) {
            return a * b;
        } else {
            return Math.min(Math.min(a, b), Math.min(c, d));
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;

int solution(int a, int b, int c, int d) {
    if (a == b && b == c && c == d) {
        return 1111 * a;
    } else if (b == c && c == d) {
        return (10 * b + a) * (10 * b + a);
    } else if (c == d && d == a) {
        return (10 * c + b) * (10 * c + b);
    } else if (d == a && a == b) {
        return (10 * d + c) * (10 * d + c);
    } else if (a == b && b == c) {
        return (10 * a + d) * (10 * a + d);
    } else if (a == b && c == d) {
        return (a + c) * abs(a - c);
    } else if (a == c && b == d) {
        return (a + b) * abs(a - b);
    } else if (a == d && b == c) {
        return (a + b) * abs(a - b);
    } else if (a == b) {
        return c * d;
    } else if (a == c) {
        return b * d;
    } else if (a == d) {
        return b * c;
    } else if (b == c) {
        return a * d;
    } else if (b == d) {
        return a * c;
    } else if (c == d) {
        return a * b;
    } else {
        return min({a, b, c, d});
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def solution(a, b, c, d):
    if a == b == c == d:
        return 1111 * a
    elif b == c == d:
        return (10 * b + a) ** 2
    elif c == d == a:
        return (10 * c + b) ** 2
    elif d == a == b:
        return (10 * d + c) ** 2
    elif a == b == c:
        return (10 * a + d) ** 2
    elif a == b and c == d:
        return (a + c) * abs(a - c)
    elif a == c and b == d:
        return (a + b) * abs(a - b)
    elif a == d and b == c:
        return (a + b) * abs(a - b)
    elif a == b:
        return c * d
    elif a == c:
        return b * d
    elif a == d:
        return b * c
    elif b == c:
        return a * d
    elif b == d:
        return a * c
    elif c == d:
        return a * b
    else:
        return min(a, b, c, d)

This post is licensed under CC BY 4.0 by the author.