본문 바로가기

개발 공부/LeetCode

451. Sort Characters By Frequency

프로그래밍에서 문자열 처리는 다양한 도전 과제를 제공합니다. 오늘 우리가 다룰 문제는 "문자를 빈도에 따라 정렬하기"입니다. 특히, Java를 사용하여 이 문제를 해결하는 과정에서 문자열이 대소문자 알파벳과 숫자로 구성되며, 문자열의 최대 길이가 5 * 10^5라는 제약 조건을 고려해야 합니다. 이번 포스트에서는 HashMap 대신 정적 배열을 사용하는 방식으로 성능을 개선한 해결 방법을 살펴보겠습니다. 🚀


문제 이해 🤔

주어진 문자열 s에서 각 문자를 그 빈도수에 따라 내림차순으로 정렬해야 합니다. 이때, 문자열은 대소문자 알파벳과 숫자로 구성되며, 이러한 제약 조건은 문제 해결 방식에 있어 중요한 고려 사항입니다.

해결 전략 📝

이 문제를 해결하기 위해, 우리는 먼저 각 문자의 빈도수를 효율적으로 계산할 방법이 필요합니다. 대소문자 알파벳과 숫자만 포함된다는 점을 고려할 때, 아스키 코드를 사용하여 각 문자를 배열의 인덱스로 매핑하고, 이 배열을 사용하여 문자의 빈도수를 계산할 수 있습니다. 이 접근 방식은 HashMap을 사용하는 것보다 메모리 사용량을 줄이고, 실행 시간을 단축시킬 수 있습니다.

1. 빈도수 계산의 최적화

아스키 코드를 활용한 정적 배열을 사용하여 각 문자의 빈도수를 계산합니다. 이 배열은 모든 가능한 문자(대소문자 알파벳과 숫자)를 포함할 수 있도록 크기를 설정해야 합니다. 각 문자의 아스키 코드 값은 배열의 인덱스로 사용되며, 이를 통해 각 문자의 빈도수를 효율적으로 계산할 수 있습니다.

2. 효율적인 정렬 메커니즘

빈도수에 따라 문자를 정렬하기 위해, 빈도수를 인덱스로 사용하는 버킷 리스트를 생성합니다. 이 방법은 정렬 과정을 단순화하며, 문자열 재구성 시 각 문자를 빈도수에 따라 쉽게 접근할 수 있도록 합니다.

개선된 구현 코드 🚀

public class Solution {
    public String frequencySort(String s) {
        // 아스키 코드를 고려한 정적 배열을 사용하여 빈도수 계산
        int[] frequency = new int[128]; // 대소문자 알파벳과 숫자 포함
        for (char c : s.toCharArray()) {
            frequency[c]++;
        }

        // 빈도수 별로 문자들을 그룹화하기 위한 버킷 생성
        List<Character>[] bucket = new List[s.length() + 1];
        for (int i = 0; i < frequency.length; i++) {
            if (frequency[i] > 0) {
                if (bucket[frequency[i]] == null) {
                    bucket[frequency[i]] = new ArrayList<>();
                }
                bucket[frequency[i]].add((char) i);
            }
        }

        // 버킷을 사용하여 문자열 재구성
        StringBuilder sb = new StringBuilder();
        for (int pos = bucket.length - 1; pos >= 0; pos--) {
            if (bucket[pos] != null) {
                for (char c : bucket[pos]) {
                    for (int i = 0; i < pos; i++) {
                        sb.append(c);


                    }
                }
            }
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        Solution solution = a new Solution();

        // 테스트 예시
        System.out.println(solution.frequencySort("tree"));
        System.out.println(solution.frequencySort("cccaaa"));
        System.out.println(solution.frequencySort("Aabb"));
    }
}

이 코드는 아스키 코드를 활용하여 문자의 빈도수를 계산하고, 이를 기반으로 문자열을 효과적으로 재구성합니다. 문자열의 길이와 구성 요소의 다양성을 고려할 때, 이 접근 방식은 대량의 데이터를 효율적으로 처리할 수 있도록 합니다.

마무리 🌟

문자열 처리는 프로그래밍에서 중요한 기술입니다. 올바른 접근 방법과 알고리즘을 사용하면, 복잡한 문제도 효율적으로 해결할 수 있습니다. 이 포스트가 문자열의 문자를 빈도에 따라 정렬하는 방법을 이해하는 데 도움이 되었기를 바랍니다. Happy coding! 👩‍💻👨‍💻

'개발 공부 > LeetCode' 카테고리의 다른 글

1463. Cherry Pickup II  (25) 2024.02.11
387. First Unique Character in a String  (45) 2024.02.05