1 분 소요

사용 언어: Python3

문제

백준 2484

스크린샷 2023-03-29 오후 11 11 23

코드

내 풀이

# 같은 눈 4개 - 50000 + 눈*5000
# 같은 눈 3개 - 10000 + 눈*1000
# 같은 눈 2개 2쌍 - 2000 + 눈*500 + 다른 눈*500
# 같은 눈 2개 1쌍 - 1000 + 눈*100
# 모두 다른 눈 - 가장 큰 눈*100

from collections import Counter

def most_freq(numbers):
  return max(numbers, key=numbers.count)

def process(price, i):
  numbers = list(map(int, input().split()))
  countNums = Counter(numbers)
  
  if len(set(numbers)) == 1:
    price[i] = 50000 + numbers[0] * 5000
  elif len(set(numbers)) == 2 and countNums.most_common(n=1)[0][1] == 3:
    price[i] = 10000 + countNums.most_common(n=1)[0][0] * 1000
  elif len(set(numbers)) == 2 and countNums.most_common(n=1)[0][1] == 2:
    price[i] = 2000 + countNums.most_common(n=2)[0][0] * 500 + countNums.most_common(n=2)[1][0] * 500
  elif len(set(numbers)) == 3:
    price[i] = 1000 + most_freq(numbers) * 100
  else:
    price[i] = max(numbers) * 100

# input
N = int(input())

price = [0 for _ in range(N)]
for i in range(N):
  process(price, i)

# output
print(max(price))
  • collections.Counter를 사용했다.

다른 풀이

def process():
  numbers = sorted(list(map(int, input().split()))) # 오름차순 정렬
  if len(set(numbers)) == 1: # 같은 눈 4개
    return 50000 + numbers[0] * 5000
  if len(set(numbers)) == 2:
    if numbers[1] == numbers[2]: # 같은 눈 3개
      return 10000 + numbers[1] * 1000
    else: # 같은 눈 2개씩 두 쌍
      return 2000 + numbers[1] * 500 + numbers[2] * 500
  for i in range(3):
    if numbers[i] == numbers[i+1]: # 같은 눈 2개
      return 1000 + numbers[i] * 100
  return numbers[-1] * 100 # 모두 다른 눈

N = int(input())

# process() 값 중 최대값 출력
print(max(process() for _ in range(N)))
  • 같은 눈 3개같은 눈 2개씩 2쌍을 어떻게 구분할지가 핵심이다.
    • 나는 collections.Counter를 썼지만 여기서는 오름차순 정렬 한 뒤에 numbers[1]numbers[2]의 값을 비교했다.
    • numbers[1] == numbers[2] 라면 같은 눈 3개인 경우이고,
    • numbers[1] != numbers[2] 라면 같은 눈 2개씩 두 쌍인 경우이다.
  • 답을 출력할 때 max(process() for _ in range(N))와 같은 방식으로 process()의 반환값을 따로 저장해두지 않고도 바로 max 값을 구할 수 있다.


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기