프로그래밍에서 문자열 처리는 다양한 도전 과제를 제공합니다. 오늘 우리가 다룰 문제는 "문자를 빈도에 따라 정렬하기"입니다. 특히, 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 |