[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.