링크🔗
https://www.acmicpc.net/problem/3758
🗒️파이썬 코드 풀이
T = int(input())
for _ in range(T):
n,k,t,m = map(int,input().split())
dic = {i :{"score":[0]*(k+1),"submit":0,"time":0} for i in range(1,n+1)}
idx = 0
for log_count in range(m):
i,j,s = list(map(int,input().split()))
dic[i]["score"][j] = max(dic[i]["score"][j],s)
dic[i]["submit"] += 1
dic[i]["time"] = idx
idx += 1
ord_dic = sorted(dic.items(), key= lambda item : (-sum(item[1]["score"]),item[1]["submit"],item[1]["time"] ))
for i in range(len(ord_dic)):
if ord_dic[i][0] == t:
print(i+1)
1. 정렬의 기준이 되는 점수, 제출 횟수, 시간을 각 팀 별로 딕셔너리를 만들어준다.
2. 로그 엔트리 개수 (m)만큼 반복하여 팀ID,문제번호,획득 점수를 입력으로 받고 ,
적절하게 인덱싱 해줘서 dic에 채워 넣는다.
2-1. 중간에 idx는 마지막 제출 시간을 위한 변수이다.
3. 완성된 딕셔너리를 문제의 기준대로 다중 정렬한다.
딕셔너리를 sorted 할 때, dict.items()로 해야하고,
lambda item : item[1]을 한 것은 key와 value 중 value로 정렬 하겠다는 의미이다.
4. ord_dic는 문제 기준대로 정렬된 딕셔너리로, 내 팀의 순위를 for문을 통해 출력한다.
📌 문제 코멘트
입력 변수가 많은 문제이다...
어떻게 풀이를 하는게 좋을지 고민을 했고, 딕셔너리가 가장 나을 것 같다는 생각이 들었다.
어떤 구조의 딕셔너리를 만들지와 딕셔너리 인덱싱에 시간을 많이 썼다.
(다른 문제 풀이를 보면 딕셔너리를 안쓰는 풀이도 있다.)
그래도 전에 풀었던 문제 덕분에, sorted 함수를 쓸 생각을 할 수 있었다.
그 문제가 아니였으면, 하나 하나 정렬 구현 했을 듯...
정렬은 무조건 sorted 함수부터 생각 !!
문제 실행하는데 8분 걸렸는데, 정상인가... 아무튼 이 풀이가 성공이 됐다.
📚문제
당신은 유명 프로그래밍 대회인 KCPC(Korean Collegiate Programming Contest)에 참가하고 있다. 이 대회에서 총 k개의 문제를 풀게 되는데, 어떤 문제에 대한 풀이를 서버에 제출하면 그 문제에 대해 0점에서 100점 사이의 점수를 얻는다. 풀이를 제출한 팀의 ID, 문제 번호, 점수가 서버의 로그에 제출되는 시간 순서대로 저장된다. 한 문제에 대한 풀이를 여러 번 제출할 수 있는데, 그 중 최고 점수가 그 문제에 대한 최종 점수가 된다. (만약 어떤 문제에 대해 풀이를 한번도 제출하지 않았으면 그 문제에 대한 최종 점수는 0점이다.)
당신 팀의 최종 점수는 각 문제에 대해 받은 점수의 총합이고, 당신의 순위는 (당신 팀보다 높은 점수를 받은 팀의 수)+1 이다.
점수가 동일한 팀이 여럿 있을 수 있는데, 그 경우에는 다음 규칙에 의해서 순위가 정해진다.
- 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다.
- 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다.
동시에 제출되는 풀이는 없고, 모든 팀이 적어도 한 번은 풀이를 제출한다고 가정하라.
서버의 로그가 주어졌을 때, 당신 팀의 순위를 계산하는 프로그램을 작성하시오.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는 팀의 개수 n, 문제의 개수 k, 당신 팀의 ID t, 로그 엔트리의 개수 m을 나타내는 4 개의 정수가 주어진다. 여기서, 3 ≤ n, k ≤ 100, 1 ≤ t ≤ n, 3 ≤ m ≤ 10,000이다. 그 다음 m개의 줄에는 각 풀이에 대한 정보가 제출되는 순서대로 주어진다. 각 줄에는 팀 ID i, 문제 번호 j, 획득한 점수 s를 나타내는 세 개의 정수가 주어진다. 여기서 1 ≤ i ≤ n, 1 ≤ j ≤ k, 0 ≤ s ≤ 100이다.
출력
출력은 표준출력을 사용한다. 주어진 각 테스트 데이터에 대해 당신 팀의 순위를 한 줄에 출력하여야 한다
예제 입력 1 복사
2
3 4 3 5
1 1 30
2 3 30
1 2 40
1 2 20
3 1 70
4 4 1 10
1 1 50
2 1 20
1 1 80
3 1 0
1 2 20
2 2 10
4 3 0
2 1 0
2 2 100
1 4 20
예제 출력 1 복사
1
2
'알고리즘 > 알고리즘_백준' 카테고리의 다른 글
[Python][백준] 2075. N번째 큰 수 (0) | 2024.07.08 |
---|---|
[Python][백준] 1927. 최소 힙 (0) | 2024.07.07 |
[Python][백준] 19941. 햄버거 분배 (0) | 2024.07.06 |
[Python][백준] 1515. 수 이어 쓰기 (0) | 2024.07.06 |
[Python][백준] 21921. 블로그 (1) | 2024.07.05 |