본문 바로가기

Programming [Python]/백준 알고리즘 솔루션

#296 백준 파이썬 [11946] ACM-ICPC

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

 

SOLUTION

문제는 크게 어렵지 않지만 데이터를 저장하고 정렬함에 있어 혼돈이 올 수 있다.

acm_icpc 결과 리스트를 [팀][문제 번호][정답 시간, 오답 수]로 3차원 배열을 만들어준다.

정답 시간엔 최댓값 + 1을 넣어준다. 정답이 나오지 않을 경우엔 틀린 문제에 +1을 해준다.

입력 자체가 시간 순으로 들어오므로 AC가 한 번 나온 이후로는 더 이상 틀린 문제를 카운트하지 않는다.

 

맞힌 문제 내림 차순, 총 시간 오름 차순, 팀 번호 오름차순으로 정렬해준다.

식으로 표현하면 다음과 같다.

grade = sorted(grade[1:], key = lambda x: (-x[1], x[2], x[0])) 

PYTHON CODE

n, m, q = map(int, input().split())
acm_icpc = [[[301, 0] for _ in range(m+1)] for _ in range(n+1)] #[정답 시간, 오답 패널티]

for _ in range(q):
    time, team, prob, result = input().split()
    time = int(time)
    team = int(team)
    prob = int(prob)
    
    if acm_icpc[team][prob][0] == 301: #아직 못 맞혔을 경우
        if result == "AC":
            acm_icpc[team][prob][0] = time #최소 정답 시간
        else:
            acm_icpc[team][prob][1] += 20 #오답 패널티

grade = [[i, 0, 0] for i in range(n+1)] #[팀 번호, 푼 문제, 총 시간]

for team in range(1, n+1):
    for prob in range(1, m+1):
        if acm_icpc[team][prob][0] != 301:
            grade[team][1] += 1 #문제 개수
            grade[team][2] += acm_icpc[team][prob][0] #정답 시간
            grade[team][2] += acm_icpc[team][prob][1] #오답 패널티

grade = sorted(grade[1:], key = lambda x: (-x[1], x[2], x[0])) #순서대로 정렬
for i in grade:
    print(i[0], i[1], i[2])