문제
https://www.acmicpc.net/problem/2480
1부터 6까지의 눈을 가진 주사위 세 개를 던져 아래와 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 3개인 경우 상금은 10,000원 + 같은 눈의 값 * 1,000원
- 같은 눈이 2개인 경우 상금은 1,000원 + 같은 눈의 값 * 100원
- 모두 다른 눈이 나온 경우 상금은 가장 큰 눈의 값 * 100원
주사위 3개의 눈의 값이 입력으로 주어질 때, 상금의 값을 출력하라.
풀이
본인이 푼 것
사용한 언어는 파이썬이다. 좀 복잡하게 풀었다. 방법은 아래와 같다.
1. 주사위 눈 값 3개를 리스트에 저장한다.
2. 주사위 눈 값을 키로, 그 개수를 값으로 하는 딕셔너리를 선언 및 초기화한다.
3. 딕셔너리의 길이를 구한다.
4. 딕셔너리 길이가 1이면 주사위 세 개의 눈의 값이 같다. 딕셔너리의 키 값으로 상금을 계산한다.
5. 딕셔너리 길이가 2이면 주사위 두 개의 눈의 값이 같다. 딕셔너리 의의 값이 2인 키의 값으로 상금을 계산한다.
6. 그 외의 경우 주사위 세 개 모두 눈의 값이 다르다. 딕셔너리의 키 목록을 정렬한 뒤, 정렬된 목록의 마지막 값으로 상금을 계산한다.
소스 코드
import sys
d = dict()
l = list(map(int, sys.stdin.readline().split()))
for i in l:
if i not in d:
d[i] = 1
else:
d[i] += 1
n = len(d)
if n == 1:
k, v = list(d.items())[0]
print(10000 + k * 1000)
elif n == 2:
for k, v in d.items():
if v == 2:
print(1000 + k * 100)
else:
m = sorted(d.keys())
print(m[-1] * 100)
좀 더 간결한 풀이
직접 해결한 방법으로도 정답 처리가 되었지만 조금 더 좋은 풀이가 없는지 확인해보니 좋은 방법이 있었다.
주사위 세 개의 눈의 값을 정렬하면 비교문을 사용하지 않고 문제를 해결할 수 있었다.
아래 표는 각 경우의 예시 하나씩을 정리해둔 것이다.
a | b | c | |
주사위 세 개의 눈의 값이 모두 다르다 | 1 | 3 | 5 |
주사위 두 개의 눈의 값이 같다 | 1 | 3 | 3 |
주사위 세 개의 눈의 값이 모두 같다 | 3 | 3 | 3 |
잘 확인해보면 b에 해당하는 값의 수가 각 경우를 결정하는 것을 볼 수 있다.
b의 값이 1개면 눈의 값이 모두 다르고, b의 값이 2개이면 주사위 눈 2개 값이 같고, b의 값이 3개면 주사위 눈의 값이 모두 같은 것이다. 이 부분을 활용하면 문제를 해결할 수 있다.
방법은 아래와 같다.
1. 입력값을 정렬하여 각각 변수에 저장한다.
2. 배열에 b의 값의 개수에 따라 각 상금을 계산하여 저장한다. 인덱스가 0부터 시작하는 것을 고려한다.
3. b의 값의 개수 - 1의 위치에 해당하는 배열 값을 출력한다.
코드
a, b, c = sorted(map(int, input().split()))
print([c, b + 10, b * 10 + 100][[a, b, c].count(b) - 1] * 100)
저런 천재적인 생각은 대체 어떻게 하는 걸까?