코딩 테스트/LeetCode

1636. Sort Array by Increasing Frequency (빈도 증가에 따른 배열 정렬)

포카리tea 2024. 10. 21. 12:13

정수 nums 배열이 주어지면 값의 빈도를 기준으로 배열을 증가하는 순서로 정렬합니다. 여러 값의 빈도가 같은 경우 감소하는 순서로 정렬합니다.

 

 

예시 1:

입력: nums = [1,1,2,2,2,3]
출력: [3,1,1,2,2,2]
설명: '3'의 빈도는 1, '1'의 빈도는 2, '2'의 빈도는 3입니다.

 

예시 2:

입력: nums = [2,3,1,3,2]
출력: [1,3,3,2,2]
설명: '2'와 '3'은 모두 빈도가 2이므로 감소하는 순서로 정렬됩니다.

 

예시 3:

입력: nums = [-1,1,-6,4,5,-6,1,4,1]
출력: [5,-1,4,4,-6,-6,1,1,1]

 

 

조건:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

 

정답:

public class Solution {
    public int[] FrequencySort(int[] nums) {
        List<Tuple<int, int>> resultTuple = new List<Tuple<int, int>>();
        List<int> numsCopy = nums.OrderByDescending(n => n).ToList();

        foreach (var num in numsCopy)
        {
            resultTuple.Add(new Tuple<int, int>(num, numsCopy.Count(n => n == num)));
        }

        List<Tuple<int, int>> result = new List<Tuple<int, int>>(resultTuple.OrderBy(n => n.Item2));

        return result.Select(n => n.Item1).ToArray();
    }
}

해설: 우선 빈도 순서대로 정렬하기 전에 빈도가 같을 때를 대비하여 감소하는 순서대로 정렬합니다.

그 후 정렬된 numsCopy를 resultTuple의 Item1에 기본값 Item2에 해당 값의 갯수, 즉 빈도를 넣습니다.

빈도가 모두 들어갔다면 해당 빈도를 기준으로 오름차순으로 정렬한 후 Item1값만 빼내어 return합니다.