알고리즘/백준

백준-9017-크로스 컨트리

hong2943 2024. 4. 5. 01:37

오답 코드

T = int(input())

for i in range(T):
    N = int(input())
    rank = list(map(int,input().split()))

    team = max(rank) # 팀 수 확인
    result = [0 for i in range(team)]

    minus = 0

    for i in range(N): # i가 인덱스가 된다.
        # print(rank[i])
        if (rank.count(rank[i]) == 6):
            result[rank[i]-1] += i
            result[rank[i]-1] += minus
            minus = 0
        else:
            minus -= 1

    print(result.index(min(result)) + 1) #

처음에는 단순히 리스트를 통해서 구현을 했다.

참가한 인원수 만큼 반복문을 돌면서 사람들의 등수인 rank 값을 result의 index로 활용하여 값을 더하는 방식으로 구현했다.

 

minus는 참가 자격이 안되는 팀의 선수들은 순위로 메겨지지 않아서 이를 처리하기 위해서 변수를 두었다.

 

하지만 이렇게 리스트를 통해서 구현을 하니 동점자에 대한 처리가 상당히 까다로웠다.


정답 코드

T = int(input())

for i in range(T):
    N = int(input())
    rank = list(map(int,input().split()))

    result = {}
    for i in range(N):
        if rank[i] in result: #이미 넣은 값
            result[rank[i]] += 1
        else: # 처음 등장한 팀
            result[rank[i]] = 1

    minus = {} #자격 미달 팀
    for a,b in result.items():
        if b < 6:
            minus[a] = 1


    score = {}  # [주자수, 점수합, 5번째 점수]
    idx = 1
    for i in range(N):
        if rank[i] not in minus: # 불합격 팀에 속하지 x
            if rank[i] in score:  # score에 기록된적이있음
                if score[rank[i]][0] < 4: # 4명 미만주자면
                    score[rank[i]][0] += 1
                    score[rank[i]][1] += idx #점수
                elif score[rank[i]][0] == 4:  
                    score[rank[i]][0] += 1
                    score[rank[i]][2] += idx # 5번째 사람의 점수
            else: # score에 첫 기록
                score[rank[i]] = [1, idx, 0]  # 최종적으로 값 입력
                
            idx += 1

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

    print(score[0][0])

다른사람의 풀이를 참조하여 문제를 해결했다.

dict 자료형과 정렬을 활용하면 쉽게 이를 해결할 수 있었다.

 

문제링크

'알고리즘 > 백준' 카테고리의 다른 글

백준-2563-색종이  (1) 2024.04.06
백준-8979-올림픽  (0) 2024.04.05
백준-11723-집합  (0) 2024.03.27
백준-1157-단어 공부  (0) 2024.03.26
백준-2979-트럭주차  (0) 2024.03.26