[백준/파이썬] 2484번: 주사위 네개

수박강아지·2025년 6월 5일

BAEKJOON

목록 보기
84/174

문제

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

풀이

  • 주사위 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원의 상금을 받게 된다.
    모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
  • N명이 참가했을 때, 가장 많은 상금을 받은 사람의 상금을 출력

딕셔너리를 활용해서 문제를 풀었습니다.

for _ in range(n):
    dice = list(map(int,input().split()))
    dic = dict()
    
    for d in dice:
        dic[d] = dic.get(d,0) + 1

    dic = sorted(dic.items(), key=lambda x: (x[1], x[0]), reverse=True)

주사위를 굴린 횟수를 리스트로 저장하고 이를 딕셔너리에 횟수와 함께 저장을 해주었습니다.
후에, 이를 나타난 횟수에 따라 정렬하고 발견 횟수가 같을 경우엔 숫자 내림차순으로 정리해주었습니다.

    reward = 0
    if len(dic) == 1:
        reward = 50000 + dic[0][0] * 5000
    elif len(dic) == 2:
        if dic[0][1] == 3:
            reward = 10000 + dic[0][0] * 1000
        else:
            reward = 2000 + dic[0][0] * 500 + dic[1][0] * 500
    elif len(dic) == 3:
        reward = 1000 + dic[0][0] * 100
    else:
        reward = dic[0][0] * 100

딕셔너리를 순회하여 길이에 따라 결과를 다르게 설정

  1. dic의 길이가 1인 경우: "모두 같은 숫자"
    • 첫 번째 원소 값을 이용해 결괏값 계산
  2. dic의 길이가 2인 경우: "3개의 숫자가 같은 경우"(1, 1, 1, 2) or "2개의 숫자가 같은 경우 2쌍"(1, 1, 2, 2) 존재
    • 이 점 유의 하세요 !
    • 첫 번째 원소의 발견 횟수가 3일 경우는 첫 번째 원소를 이용해 계산
    • 아닐 경우 같은 숫자 2개가 2쌍인 경우이므로 첫 번째 값과 두 번째 값 이용해 계산
  3. dic의 길이가 3인 경우: "2개의 숫자만 같은 경우"(1, 1, 2, 3) 존재
    • 발견 횟수를 기준으로 내림차순 정렬했으니, 첫 번째 원소를 이용해 계산
  4. 모두 아닌 경우: "모두 다른 숫자"
    • 가장 큰 수(첫 번째 원소)를 이용해 계산
    answer = max(answer, reward)

print(answer)

참가자 중 최댓값만 출력하면 되므로, 반복문 마지막에 항상 최댓값 비교하고 마지막으로 출력해주면 끝 😊

코드

import sys
input = sys.stdin.readline

n = int(input())
answer = 0
for _ in range(n):
    dice = list(map(int,input().split()))
    dic = dict()
    
    for d in dice:
        dic[d] = dic.get(d,0) + 1

    dic = sorted(dic.items(), key=lambda x: (x[1], x[0]), reverse=True)

    reward = 0
    if len(dic) == 1:
        reward = 50000 + dic[0][0] * 5000
    elif len(dic) == 2:
        if dic[0][1] == 3:
            reward = 10000 + dic[0][0] * 1000
        else:
            reward = 2000 + dic[0][0] * 500 + dic[1][0] * 500
    elif len(dic) == 3:
        reward = 1000 + dic[0][0] * 100
    else:
        reward = dic[0][0] * 100
    
    answer = max(answer, reward)
    
print(answer)

0개의 댓글