본문 바로가기
개발/백준 알고리즘

[백준] 2480: 주사위 세개 (Python)

1. 문제 정보

문제 링크: https://www.acmicpc.net/problem/2480

문제 요약: 3개의 주사위 눈금을 입력받아, 3개가 모두 같은 경우, 2개만 같은 경우, 모두 다른 경우에 따라 정해진 규칙대로 상금을 계산하여 출력하는 문제입니다.


2. 풀이

접근 방식

문제를 처음 읽고, 3개의 숫자를 비교하여 3가지 경우(모두 같음, 2개만 같음, 모두 다름)로 분기하는 if-elif-else 조건문을 사용해야 한다고 생각했습니다

 

3개의 숫자를 a, b, c 변수로 받아서 if a == b and b == c:... elif a == b or b == c or a == c:... else:... 처럼 모든 경우의 수를 따질 수도 있지만 코드가 복잡해질 것 같았습니다.

 

더 간단한 방법은 3개의 숫자를 리스트에 받아 정렬하는 것입니다

3개의 숫자를 리스트 nums에 저장합니다. (예: [6, 2, 5])

nums.sort()를 호출하여 리스트를 오름차순으로 정렬합니다. (예: [2, 5, 6])

정렬된 리스트 nums는 항상 nums[0] <= nums[1] <= nums[2]를 만족합니다

 

이제 3가지 경우를 쉽게 확인할 수 있습니다.

  1. 모두 같은 경우: nums[0](최소값)과 nums[2](최대값)가 같으면 3개 모두 같은 것입니다. (예: [5, 5, 5])
  2. 2개만 같은 경우: (1)이 아닐 때, nums[0] == nums[1] 이거나 nums[1] == nums[2] 이면 2개만 같은 것입니다. (예: [2, 2, 5] 또는 [2, 5, 5])
  3. 모두 다른 경우: (1)과 (2)가 모두 아니면 else로 처리합니다. (예: [2, 5, 6])

이 접근 방식은 3개의 숫자로 개수가 고정되어 있으므로 시간 복잡도와 공간 복잡도 모두 O(1)입니다.

 

핵심 코드 설명

#3개를 리스트에 정수로 저장
nums = list(map(int, input().split()))

#오름차순 정렬
nums.sort()

#3개가 모두 같은 경우
if nums[0] == nums[2]:
    prize = 10000 + nums[0] * 1000

#2개만 같은 경우
elif nums[0] == nums[1] or nums[1] == nums[2]:
    #정렬했기 때문에 중간값(nums[1])이 항상 같은 눈
    prize = 1000 + nums[1] * 100

#모두 다른 경우
else:
   		 #정렬했기 때문에 가장 큰 값은 항상 nums[2]
    prize = nums[2] * 100

print(prize)

3. 회고

  • 어려웠던 점: 접근 방식에서 언급했듯이, 처음에는 a, b, c 세 변수를 그대로 두고 if a == b and b == c:를 확인한 뒤, elif a == b:, elif b == c:, elif a == c: 처럼 2개가 같은 모든 경우를 나누려 했습니다. 하지만 이 방법은 elif가 3개나 필요하고 코드가 깔끔하지 않았습니다.
  • 개선할 점: 입력을 받자마자 리스트에 담아 sort()로 정렬하는 아이디어가 핵심이었습니다.
    정렬을 하니 3가지 케이스를 매우 명확하고 간결하게 나눌 수 있었습니다
    1. (모두 같음): nums[0] == nums[2]
    2. (2개 같음): nums[0] == nums[1] or nums[1] == nums[2] (1번에서 걸러졌으므로 a==c 경우는 자동 제외됨)
    3. (모두 다름): `else