[Python] 백준 문제풀이 - 2910번

이형래·2022년 8월 12일
1

백준문제풀이

목록 보기
36/36

백준 문제풀이 - 2910 번


링크 -> https://www.acmicpc.net/problem/2910


1. 요약 및 풀이방법

어떤 수열을 빈도순, 입력순으로 정렬하는 문제입니다.

간단한거 같지만 은근 까다롭게 느껴졌던 문제입니다.
결국 수열의 각 수의 빈도, 등장 순서 등을 한번에 dict를 이용해서 정리한 후,
원하는 기준으로 정렬해주었습니다.

count의 각 key는 해당 수이고, value[빈도, 등장인덱스, 수]의 리스트입니다.
이렇게 모든 수에 대해 정리한 후, 빈도 및 등장 인덱스를 기준으로 정렬하여 출력했습니다.


2. Code

def main():
    n, c = map(int, input().split())
    numbers = list(map(int, input().split()))
    count = {}
    for idx, num in enumerate(numbers):
        if num in count:
            count[num][0] += 1
        else:
            count[num] = [1, idx, num]

    frequency = sorted(count.values(), key= lambda x: (-x[0], x[1]))
    result = []
    for fre in frequency:
        result += [fre[2]] * fre[0]
    print(*result)

if __name__ == "__main__":
    main()

3. 학습 내용

정렬 기준은

  1. 빈도
  2. 등장 순서

입니다.
또한 빈도는 내림차순, 빈도가 같은 경우 순서는 오름차순으로 정렬이 되어야 우리가 원하는 순서로 정렬할 수 있습니다.
따라서 sorted 함수의 key값을 위 코드와 같이 작성해서 해결했습니다.
위 코드에서 lambda의 각 x[빈도, 등장인덱스, 수] 입니다.


4. 결과

profile
머신러닝을 공부하고 있습니다. 특히 비전 분야에 관심이 많습니다.

0개의 댓글