[Algorithm] 백준 2484 - 주사위 네 개

apro_xo·2021년 12월 8일
0
post-thumbnail

문제

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

  1. 같은 눈이 4개가 나오면 50,000원+(같은 눈)×5,000원의 상금을 받게 된다.
  2. 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)×1,000원의 상금을 받게 된다.
  3. 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받게 된다.
  4. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  5. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.

예를 들어, 4개의 눈이 3, 3, 3, 3으로 주어지면 50,000+3×5,000으로 계산되어 65,000원의 상금을 받게 된다.
4개의 눈이 3, 3, 6, 3으로 주어지면 상금은 10,000+3×1,000으로 계산되어 13,000원을 받게 된다.
또 4개의 눈이 2, 2, 6, 6으로 주어지면 2,000+2×500+6×500으로 계산되어 6,000원을 받게 된다.
4개의 눈이 6, 2, 1, 6으로 주어지면 1,000+6×100으로 계산되어 1,600원을 받게 된다.
4개의 눈이 6, 2, 1, 5로 주어지면 그 중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

N(1 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.

풀이

set()을 이용하여 리스트의 요소 중 중복을 제거하여 해결

  • 같은 눈이 4개
list = [5, 5, 5, 5]
listSet = set(list) # {5}
print(len(listSet)) # 1
  • 같은 눈이 3개
list = [5, 5, 5, 1]
listSet = set(list) # {5, 1}
print(len(listSet)) # 2
  • 같은 눈이 2개 + 2개
list = [1,1,2,2]
listSet = set(list) # {1, 2}
print(len(listSet)) # 2
  • 같은 눈이 두 개만 나올 때
list = [1,2,5,5]
listSet = set(list) # {5, 1, 2}
print(len(listSet)) # 3
  • 눈의 갯수가 다 다를 때
list = [1, 2, 3, 4]
listSet = set(list) # {1, 2, 3, 4}
print(len(listSet)) # 4

코드

def func(arr):
    result = 0
    if len(set(arr)) == 1:
        result = 50000 + (arr[0] * 5000)

    elif len(set(arr)) == 2:
        if arr[1] == arr[2]:
            result = 10000 + (arr[1] * 1000)

        elif arr[1] != arr[2]:
            result = 2000 + (arr[0] * 500) + (arr[2] * 500)
        
    elif len(set(arr)) == 3:
        if arr[0] == arr[1]:
            result = 1000 + (arr[0] * 100)

        elif arr[1] == arr[2]:
            result = 1000 + (arr[1] * 100)
        else:
            result = 1000 + (arr[2] * 100)

    elif len(set(arr)) == 4:
        result = arr[3] * 100

    return result

N = int(input())
answer = []
for i in range(N):
    arr = sorted(list(map(int, (input().split()))))
    answer.append(func(arr))
    
print(max(answer))

풀이 에서 설명했던 것을 이용하여 if, elif 조건문으로 해결하였다.

여기서 주의할 점은 주사위의 눈을 input()을 이용하여 받은 다음, arr에 저장할 때 sorted() 후 저장한다는 것이다.

N = int(input())
answer = []
for i in range(N):
    arr = sorted(list(map(int, (input().split()))))
    answer.append(func(arr))
    
print(max(answer))

이유는 리스트를 집합으로 변환한 후 집합의 길이를 이용하여 경우의 수를 나눴는데, 세부적으로 또 경우를 나눠야하고 상금에 어떤 값을 적용시켜야 할지 결정해야되기 때문이다.

예를 들어,

list = [5, 5, 5, 1]
list2 = [2, 2, 1, 1]
print(len(set(list))) # 2
print(len(set(list2))) # 2

위 코드의 두 집합의 크기는 같다. 따라서 sorted()를 적용한다.

temp1 = sorted(list) # [1, 5, 5, 5]
temp2 = sorted(list2) # [1, 1, 2, 2]

temp1의 경우, temp1[1], temp[2]가 다르다. 4개의 눈들을 정렬하여 [1]과 [2] 중간 값들을 비교했을 때 다르면 2개씩 같고 서로 다르다는 것이다. ex)[1,1,2,2]

temp2의 경우, temp1[1], temp2[2]가 같다. 4개의 눈들을 정렬하여 두 값이 같으면 3개 같고 1개 다르다는 것이다. ex)[1,1,1,2]

profile
유능한 프론트엔드 개발자가 되고픈 사람😀

0개의 댓글