백준 & 프로그래머스
[백준] 3758번 KCPC - python
hyukji
2023. 4. 7. 02:09
문제보기
https://www.acmicpc.net/problem/3758
3758번: KCPC
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는
www.acmicpc.net
풀이 및 코드
해당 문제는 특별한 알고리즘 활용 보다는 단순 구현 문제이다.
필자는 id 별로 값을 비교해야 하는 상황이 있을 시에 heap구조를 이용했다. heap 구조가 이럴때 편한게 list 형태로 value를 저장할 때에 첫번째 인자만 sort에 영향을 주기 때문에 시간 관리 차원이나 코드의 이해도 차원에서나 장점이 많다고 생각한다.
자세한 내용은 주석을 따라가며 실행하면 이해될 것이다!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from heapq import heappush, heappop | |
import sys | |
input=sys.stdin.readline | |
T = int(input()) | |
for _ in range(T): | |
n, k, t, m = map(int, input().split()) | |
score = [[0 for _ in range(k+1)] for _ in range(n+1)] # id 별로 점수 합 | |
n_log = [0 for _ in range(n+1)] # id별로 log 개수 | |
logs = [] # 로그들 id만 따로 저장 | |
for _ in range(m): | |
i, j, s = map(int, input().split()) | |
score[i][j] = max(score[i][j], s) | |
n_log[i] += 1 | |
logs.append(i) | |
result = [] | |
for i in range(n+1): | |
# 가장 큰 값을 pop 시키기 위해서 음수로 저장 [score, id] | |
heappush(result, [(-1) * sum(score[i]), i]) | |
# t보다 순위 높은 팀 나올때마다 rank += 1 | |
rank = 1 | |
last_score = 0 | |
# t팀보다 점수 작은 팀 나올 때까지 same_result_team와 rank변수 관리 | |
find_t = False | |
same_result_team = [] | |
for _ in range(n): | |
_s, _i = heappop(result) | |
_s *= (-1) | |
if _s != last_score: | |
if find_t == True: | |
break | |
rank += len(same_result_team) | |
same_result_team = [_i] | |
else: | |
same_result_team.append(_i) | |
last_score = _s | |
if _i == t: | |
find_t = True | |
# log 나중에 나온 팀 계산 | |
same_result_team.remove(t) | |
logs.reverse() | |
for _i in same_result_team: | |
if n_log[t] > n_log[_i]: | |
rank += 1 | |
elif n_log[t] == n_log[_i]: | |
# 로그 순서 뒤집고 index 함수 사용시 먼저 나오면 더 나중에 불린것 | |
lt = logs.index(t) | |
li = logs.index(_i) | |
if lt < li: | |
rank+=1 | |
print(rank) |
해당 문제는 실버 3에 랭크되어있다.