백준 2480번 풀이

문제

1부터 6까지 있는 6면 주사위를 던져서 그 눈에 따라 상금을 받게 되는데

1) 세개가 다 같은 눈이면 10000원+n000원(n = 주사위 눈 값)

2) 두개가 같은 눈이면 1000+n00원(n = 주사위 눈 값)

3) 하나가 같은 눈이면 n00원(n = 제일 큰 값)

을 받는다.

reference

https://www.acmicpc.net/board/view/86935

풀이

주사위 눈의 값을 비교해야 하므로, 단순히 int로 입력받으면 안된다.

import sys
dice = list(map(int, sys.stdin.readline().split()))
print(dice)

리스트 갑시다.

전부 같은 눈일 때

if dice[0] == dice[1] == dice[2]:
  prize = 10000 + dice[0] * 1000
  print(prize)

이 부분은 쉽다. 셋 다 같은 값이기때문에 아무 값이나 가져오면 된다.

전부 다른 눈일 때

else: 
  prize = max(dice) * 100
  print(prize)

여기도 제일 큰 값 찾아서 곱하면 된다.

두 개가 같은 눈일 때

elif dice[0] == dice[1] or dice[1] == dice[2]:
  prize = 1000 + dice[1] * 100
  print(prize)

리퍼런스도 이 놈 관련이다. 대관절 이게 어찌 된 거냐…

편의상 인덱스(0,1,2)로 표기하자면, 0 = 1, 0 = 2, 1 = 2 세 가지 케이스에 대해 확인을 해야 한다. 그리고 저때에 대비해서 최소한 elif까지 포함해 분기가 네 개는 나와야 한다. (0이 1이나 2랑 같으면 0 곱하면 된다) 근데 리퍼런스에 답을 주신 분께서는 저걸 조건문 하나로 줄여버렸다.

입력값이 1 2 1일 때 리스트를 정렬하면 1 1 2가 되고, 입력값이 2 1 2일 때 리스트를 정렬하면 1 2 2가 된다. 즉, 정렬한 상태에서는 0 = 1 or 1 = 2이고, 이 때 공통분모가 1이니까 정렬한 리스트에서 두번째만 가져오면 된다.

최종 코드

import sys
dice = list(map(int, sys.stdin.readline().split()))
dice = sorted(dice)
prize = 0
if dice[0] == dice[1] == dice[2]:
  prize = 10000 + dice[0] * 1000
  print(prize)
elif dice[0] == dice[1] or dice[1] == dice[2]:
  prize = 1000 + dice[1] * 100
  print(prize)
else: 
  prize = max(dice) * 100
  print(prize)

그래서 리스트를 정렬하게 되면 이렇게 된다.

import sys
dice = list(map(int, sys.stdin.readline().split()))
prize = 0
if dice[0] == dice[1] == dice[2]:
  prize = 10000 + dice[0] * 1000
  print(prize)
elif dice[0] == dice[1] or dice[0] == dice[2]:
  prize = 1000 + dice[0] * 100
  print(prize)
elif dice[1] == dice[2]:
  prize = 1000 + dice[1] * 100
  print(prize)
else: 
  prize = max(dice) * 100
  print(prize)

정렬 없는 버전은 이거.