[BOJ] 9017. 크로스 컨트리

Jimeaning·2024년 3월 25일
0

코딩테스트

목록 보기
143/143

Python3

문제

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

키워드

  • 구현

문제 풀이

문제 요구사항

모든 선수들의 등수가 주어질 때, 우승팀을 구하는 프로그램

  • 한 팀은 여섯 명의 선수로 구성되며, 팀 점수는 상위 네 명의 주자의 점수를 합하여 계산
  • 점수는 자격을 갖춘 팀의 주자들에게만 주어지며, 결승점을 통과한 순서대로 점수를 받는다
  • 이 점수를 더하여 가장 낮은 점수를 얻는 팀이 우승
  • 여섯 명의 주자가 참가하지 못한 팀은 점수 계산에서 제외 (주의)
  • 동점의 경우에는 다섯 번째 주자가 가장 빨리 들어온 팀이 우승

주의 사항)
각 팀의 참가 선수가 여섯보다 작으면 그 팀은 점수 계산에서 제외됨
여섯 명 보다 많은 선수가 참가하는 팀은 없음
적어도 한 팀은 참가 선수가 여섯
모든 선수는 끝까지 완주를 한다고 가정

변수 및 함수 설명

  • t : 테스트 케이스의 수
  • num : 하나의 정수 N
    (6 ≤ N ≤ 1,000)
  • team : 팀 번호를 나타내는 N 개의 정수
    각 팀은 1 과 M(1 ≤ M ≤ 200)사이의 정수
  • count : 팀원 수를 저장하는 리스트
  • dele : 6인 미만으로 제외할 팀
  • rank : 등수
  • score : 점수

풀이

  • count 딕셔너리에 팀명 : 개수 형태로 저장한다
  • dele 딕셔너리에 count 딕셔너리 value 중 6보다 작은 팀명을 저장한다
  • rank는 1부터 시작하고, num번의 반복문을 돈다
  • dele에 있는 팀은 제외하고 연산한다
  • 만약 score 딕셔너리 내에 팀이 없으면 [1, rank, 0]으로 초기 값을 넣어준다
    주자 수, 총점, 다섯 번째 주자 점수 순이다
  • 이미 나온 팀이면 네 번째 주자 전까지 연산한다
    • 네 번째 주자 전까지는 주자 수 + 1 증가시키고, 총점에 rank 값을 누적한다
    • 네 번째 주자가 되면 주자 수 + 1 증가시키고, 다섯 번째 주자 점수를 넣는다
  • sorted 함수와 람다식을 사용해 먼저 총점으로 정렬하고, 동점일 경우에 다섯 번째 주자 점수로 정렬한다

최종 코드

t = int(input())

for _ in range(t):
    num = int(input())
    count = {}
    team = list(map(int, input().split()))

    for i in range(num):
        if team[i] in count:
            count[team[i]] += 1
        else:
            count[team[i]] = 1

    dele = {}
    for k, v in count.items():
        if v < 6:
            dele[k] = 1

    rank = 1
    score = {}
    for i in range(num):
        if team[i] not in dele:
            if team[i] in score:
                if score[team[i]][0] < 4:
                    score[team[i]][0] += 1
                    score[team[i]][1] += rank
                elif score[team[i]][0] == 4:
                    score[team[i]][0] += 1
                    score[team[i]][2] = rank
            else:
                score[team[i]] = [1, rank, 0]
                
            rank += 1

    ans = sorted(score.items(), key=lambda x:(x[1][1], x[1][2]))
    print(ans[0][0])

피드백

복잡해서 혼자 힘으로 푸는데 시행착오를 겪어 블로그를 참고하고 풀었다
이런 건 이제 혼자 짧은 시간 내에 풀고 싶다..

profile
I mean

0개의 댓글