https://www.acmicpc.net/problem/2456
풀이 과정
문제에서 어떻게 구현하라고 다 나와있기 때문에 그대로 구현해주면 된다. 여기서는 개인적으로는 map과 filter을 잘 사용하면 소스코드가 많이 간결해질 수 있을 것이라고 생각된다.
- 각 후보가 점수별로 몇점을 획득하였는지 저장해 둔다.
- 전체 점수의 합계가 가장 큰 후보군을 먼저 골라준다.
- 후보군이 2명 이상인 경우에는 다음 단계로 진행한다.
- 3점을 가장 많이 받은 사람의 집합으로 후보군을 줄여준다.
- 이후, 2점을 가장 많이 받은 사람의 집합으로 후보군을 줄여준다.
- 모든 단계를 거치고 난 다음에도 후보군이 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 |