Algorithem/백준 PS with code

백준 #3758 - [S3] KCPC : 정렬

jamong5 2023. 6. 12. 11:32

(python3)

 

3758번: KCPC

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는

www.acmicpc.net

 

딕셔너리 정렬

문제 조건이 많기 때문에 딕셔너리를 활용해서 구현하면 직관적인 코딩이 가능합니다.

딕셔너리를 완성한 후 점수 기준에 맞춰 sorted 와 key 파라미터를 활용해 커스텀한 정렬을 실행해줍니다.

sorted 사용법은 다음 글에 자세히 설명해두었습니다.

 

[sort] 파이썬에서 커스텀한 기준으로 이터러블한 객체 정렬하기

key 파이썬에서 제공하는 sorted 기능은 key 파라미터로 커스텀한 기준을 부여하여 정렬할 수 있습니다. 파이썬 sort 관련 독스에서도 이를 확인할 수 있습니다. https://docs.python.org/ko/3/howto/sorting.html#k

jamong-5.tistory.com

 

코드

import sys
def solution(input) :
    T = int(input().strip())
    
    def print_my_team_ranking(n,k,t,m) :
    	# 제출 로그 입력 받아오기
        log = []
        for _ in range(m) :
            log.append(list(map(int,input().split())))
        # 팀별 정보를 저장하는 dict 만들어서 채우기
        score_dict = {t:{'score_by_quiz':{0:0}, 'last_sub':0, 'sub_cnt':0}}
        for time,(i,j,s) in enumerate(log) : #제출순서,팀id,문제번호,점수
            if i in score_dict :
                score_dict[i]['last_sub'] = time
                score_dict[i]['sub_cnt'] += 1
                if j in score_dict[i]['score_by_quiz'] :
                    score_dict[i]['score_by_quiz'][j] = max(s,score_dict[i]['score_by_quiz'][j])
                else :
                    score_dict[i]['score_by_quiz'][j] = s
            else :
                score_dict[i] = {'score_by_quiz':{j:s}, 'last_sub':time, 'sub_cnt':1}
        # 팀별 최종 스코어 계산하기
        # f_score,sub_cnt,last_sub,team
        for team in score_dict :
            fs = 0
            for s in score_dict[team]['score_by_quiz'].values() :
                fs+=s
            score_dict[team]['f_score'] = fs
        # 기준에 따라 정렬하기
        fsd = sorted(score_dict, key = lambda x : (score_dict[x]['f_score']*-1,score_dict[x]['sub_cnt'],score_dict[x]['last_sub']))
		# 우리팀 등수 출력하기
        for ans, i in enumerate(fsd) :
            if i == t :
                print(ans+1)
                return

    for _ in range(T) :
        n,k,t,m = list(map(int,input().split())) # 팀개수, 문제개수, 팀id, 엔트리수
        print_my_team_ranking(n,k,t,m)

input = sys.stdin.readline
solution(input)

 

my solved.ac :

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac