본문 바로가기

Problem Solving/boj

[BOJ] 2456. 나는 학급회장이다(Python)

www.acmicpc.net/problem/2456

 

2456번: 나는 학급회장이다

첫째 줄에는 반의 학생들의 수 N (3 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데, 첫 번째 점수는 후보 1번에 대한 점수이고 두

www.acmicpc.net

브론즈 1 문제이다.

단순 하드코딩으로 이차원 배열에 3명의 후보별로 [총점, 3점, 2점] 리스트로 구성해 정렬하는 방식으로 풀다가 막혀서 구글링하다가 3점, 2점 점수 합 제곱을 해줘서(가중치 처리) 크기 비교를 하는 풀이법을 찾았다. (이런 아이디어 나도 내고 싶다..)

아이디어를 참고해 풀었다.

 

파이썬 코드는 다음과 같다.


import sys
input = sys.stdin.readline

N = int(input())
arr1 = [0] * 3    # 후보별 총 점수 배열
arr2 = [0] * 3    # 후보별 선호도 점수를 제곱해서 합산한 배열
for _ in range(N):
    a, b, c = map(int, input().strip().split())
    # 후보마다 점수 더해주기
    arr1[0] += a
    arr1[1] += b
    arr1[2] += c
    # 제곱해서 더해주기
    arr2[0] += a*a
    arr2[1] += b*b
    arr2[2] += c*c
# print(arr1, arr2)

max_value = max(arr1)
if arr1.count(max_value) == 1:	# 총합 가장 큰 사람 1명이면
    for i in range(3):
        if arr1[i] == max_value:
            print(i+1, max_value)
else:	# 그렇지 않다면 
    next_max_value = max(arr2)
    idx = arr2.index(next_max_value)
    if arr2.count(next_max_value) == 1:	  # 제곱합이 가장 큰 사람이 1명이면
        print(idx+1, arr1[idx])
    else:	# 그렇지 않으면 1등 없음
        print(0, arr1[idx])

  • 시간 108ms(1등 달성!) / 메모리 12220KB
  • 고찰 : 브론즈 문제라고 쉽게 봤다가 결국 다른 풀이를 참고해서 풀었다. 나태해지지 말자.