본문 바로가기
코딩test공부/백준python

9017.크로스 컨트리

by 왕방개 2024. 1. 8.

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

 

9017번: 크로스 컨트리

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 케이스로 주어진다. 입력 파일의 첫 번째 줄에 테스트 케이스의 수를 나타내는 정수 T 가 주어진다. 두 번째 줄부터는 두 줄에 하나의

www.acmicpc.net

 

1.설명

위 그래프는 함수 선언할때 고민했던 그림입니다. 이번 문제 돌리면서 가장 헷갈렸던 부분이 2개정도 있는데

1)팀원이 6명이 안될시에 NaN값을 어떻게 넣을지에 대한 고민

2)점수를 어떻게 줘야할지?

에 대해서 고민하다가 그냥 6명이 안되는 팀들은 제거를 한뒤 점수 입력을 하자라는 생각이 들었습니다.

 

def main():
    T = int(input())
    for _ in range(T):
        N = int(input())
        Rank = list(map(int, input().split()))
        if len(Rank) != N:
            print("잘못된 입력입니다")
            break
        else:
            winner = calculate_winner(N, Rank)
            print("Winner for this test case:", winner)


if __name__ == "__main__":
    main()

일단 기본 main 함수를 정의 했습니다. 그럼 이제 calculate_winner부분을 정의 해보도록 하죠

def calculate_winner(N, Rank):
    count = {}  #각팀의 주자수 세기

    for i in range(N):
        if Rank[i] in count:
            count[Rank[i]] += 1
        else:
            count[Rank[i]] = 1

    # 6명 안되면 제거하기
    count = {key: value for key, value in count.items() if value >= 6}

    score = {}  # 각 팀 점수 확인
    idx = 1
    for i in range(N):
        if Rank[i] in count:
            if Rank[i] in score:
                if score[Rank[i]][0] < 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
                
            else:
                score[Rank[i]] = [1, idx, 0]

            idx += 1

    # 점수와 5번째 주자 위치로 저장
    team = sorted(score.items(), key=lambda x: (x[1][1], x[1][2]))

    return team[0][0]  # 1등팀 반환

사실 이 함수정의 자체가 메인이라고봅니다. 각 팀의 주자수 세기는 항상 해왔던거!!! 그러면 6명이 안되면 제거하기는 list comprehension을 활용해서 문제를 풀었습니다. 또 score계산하는게 젤 어려웠는데.... 다른 블로그들을 참고하면서 문제를 풀었던거같아용 :) 

2.코드

def calculate_winner(N, Rank):
    count = {}  #각팀의 주자수 세기

    for i in range(N):
        if Rank[i] in count:
            count[Rank[i]] += 1
        else:
            count[Rank[i]] = 1

    # 6명 안되면 제거하기
    count = {key: value for key, value in count.items() if value >= 6}

    score = {}  # 각 팀 점수 확인
    idx = 1
    for i in range(N):
        if Rank[i] in count:
            if Rank[i] in score:
                if score[Rank[i]][0] < 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
                
            else:
                score[Rank[i]] = [1, idx, 0]

            idx += 1

    # 점수와 5번째 주자 위치로 저장
    team = sorted(score.items(), key=lambda x: (x[1][1], x[1][2]))

    return team[0][0]  # 1등팀 반환


def main():
    T = int(input())
    for _ in range(T):
        N = int(input())
        Rank = list(map(int, input().split()))
        if len(Rank) != N:
            print("잘못된 입력입니다")
            break
        else:
            winner = calculate_winner(N, Rank)
            print("Winner for this test case:", winner)


if __name__ == "__main__":
    main()

개인적으로 풀면서 좀 헷갈렸던 부분이 많았던거 같아요. 실력을 더 키워서 이런것도 한방에 빠바박!!

 

'코딩test공부 > 백준python' 카테고리의 다른 글

20920.영단어 암기는 괴로워  (1) 2024.01.10
13305.주유소  (1) 2024.01.09
1244.스위치 끄고 켜기  (2) 2024.01.04
8979.올림픽  (1) 2024.01.03
10431.줄세우기  (0) 2024.01.02