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

 

2456번: 나는 학급회장이다

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

www.acmicpc.net


풀이 과정


문제에서 어떻게 구현하라고 다 나와있기 때문에 그대로 구현해주면 된다. 여기서는 개인적으로는 map과 filter을 잘 사용하면 소스코드가 많이 간결해질 수 있을 것이라고 생각된다.

  1. 각 후보가 점수별로 몇점을 획득하였는지 저장해 둔다.
  2. 전체 점수의 합계가 가장 큰 후보군을 먼저 골라준다.
  3. 후보군이 2명 이상인 경우에는 다음 단계로 진행한다.
    1. 3점을 가장 많이 받은 사람의 집합으로 후보군을 줄여준다.
    2. 이후, 2점을 가장 많이 받은 사람의 집합으로 후보군을 줄여준다.
  4. 모든 단계를 거치고 난 다음에도 후보군이 2명 이상이라면 0과 최대 점수를 출력해 주고, 후보군이 1명이라면 해당 인원의 번호와 점수를 출력해 준다.

소스 코드


import sys

input = lambda: sys.stdin.readline().rstrip()
N = int(input())

score = [[0] * 3 for _ in range(3)]

for _ in range(N):
    a, b, c = map(int, input().split())
    score[0][a-1] += a
    score[1][b-1] += b
    score[2][c-1] += c

total_score = [[idx, sum(sc)] for idx, sc in enumerate(score)]
max_score = max(map(lambda x: x[1], total_score))
candidate = list(filter(lambda x: x[1] == max_score, total_score))

if len(candidate) >= 2:
    max_three_count = max(map(lambda x: score[x[0]][2], candidate))
    candidate = list(filter(lambda x: score[x[0]][2] == max_three_count, candidate))
    max_two_count = max(map(lambda x: score[x[0]][1], candidate))
    candidate = list(filter(lambda x: score[x[0]][1] == max_two_count, candidate))

if len(candidate) >= 2:
    print(0, max_score)
else:
    print(candidate[0][0] + 1, candidate[0][1])

'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글

[ 2638 ] [ BFS ] 치즈  (0) 2022.01.14
[ 1058 ] [ Floyd ] 친구  (0) 2022.01.13
[ 16398 ] [ Kruskal ] 행성 연결  (0) 2022.01.09
[ 2688 ] [ DP ] 줄어들지 않아  (0) 2022.01.06
[ 1826 ] [ Greedy ] 연료 채우기  (0) 2022.01.05

+ Recent posts