본문 바로가기

알고리즘 문제풀이

백준 8979 올림픽 Python 구현 정렬 실버5

100점 코드, 

sys.readline()으로 실행시간을 줄였고

cnt2 를 줘서 같은 등수를 가졌을 때는 등수가 오르지 않는 대신

그 다음 등수를 가진 나라는 cnt2를 그 수치만큼 더하고, cnt2를 0으로 초기화해서 다음에 나올 같은 등수 국가들을 처리하는 과정을 가졌다.

import sys;
# 실버 5
N,K = map(int,sys.stdin.readline().split())

arr = [list(map(int,input().split())) for _ in range(N)]
arr.sort(key=lambda x : (x[1],x[2],x[3]),reverse=True)
# 같은 등수일 때 어떻게 표현할까
cnt = 0
cnt2 = 0
for i in range(len(arr)):
    if arr[i][1:4] != arr[i-1][1:4]:
        cnt += 1
        cnt += cnt2
        cnt2 = 0
    else:
        cnt2 += 1
    arr[i].append(cnt)
for x in arr:
    if x[0] == K:
        print(x[4])

20점 짜리 코드

1. 가중치를 줘서 해결하려고했으나,

가중치로 풀이하면 안되는 문제였음

2. 등수 표현할 떄

1 2 2 4 이렇게 표현되는 것이 아닌

1 2 2 3 으로 표현되는 코드를 작성했음

# 실버 5
N,K = map(int,input().split())

arr = [list(map(int,input().split())) for _ in range(N)]
new_arr = []
for i in arr:
    sum_v = i[1] * 3 + i[2]* 2 + i[3]* 1
    new_arr.append([i[0],sum_v])
new_arr.sort(key=lambda x : x[1],reverse=True)
# 같은 등수일 때 어떻게 표현할까
cnt = 0
for i in range(len(new_arr)):
    if new_arr[i][1] != new_arr[i-1][1]:
        cnt += 1
    else:
        pass
    new_arr[i].append(cnt)
for x in new_arr:
    if x[0] == K:
        print(x[2])