Algorithm/문제 풀이

[BOJ] 2480 - 주사위 세개

비번변경 2021. 10. 21. 19:04

문제

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

1부터 6까지의 눈을 가진 주사위 세 개를 던져 아래와 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 3개인 경우 상금은 10,000원 + 같은 눈의 값 * 1,000원
  2. 같은 눈이 2개인 경우 상금은 1,000원 + 같은 눈의 값 * 100원
  3. 모두 다른 눈이 나온 경우 상금은 가장 큰 눈의 값 * 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)

 


 

저런 천재적인 생각은 대체 어떻게 하는 걸까?

728x90