▼ Why ?
일단 해시함수를 사용하는 것에 익숙해지기 위해 관련 문제를 계속 풀어보려고 한다
▼ 같은 빈도수 만들기
문제 정보
- 소문자 a, b, c, d, e로 이루어진 문자열이 주어지면 해당 문자열에서 a, b, c, d, e의 최소의 개수를 추가하여 a, b, c, d, e의 빈도수가 동일하게 되도록 해야 합니다.
- 동일빈도수가 되는 최소 추가 개수를 알파벳 a, b, c, d, e순으로 배열에 저장하여 반환하는 프로그램을 작성하세요.
- 만약 주어진 문자열이 "aaabc" 라면 빈도수는 a:3 , b:1, c:1, d:0, e:0 이고 최소 개수를 추가하여 동일 빈도수가 되게 하려면 b를 2개, c를 2개, d를 3개, e를 3개 추가하면 모두 빈도 수가 3개로 동일해집니다.
입출력 예
제한사항
- 문자열 s의 길이는 100을 넘지 않습니다.
어떻게 해결해야 할까?
- 일단 동일 빈도수가 되기 위해 추가해야 하는 최소 개수를 저장할 배열(크기 : 5)을 생성하자
- 빈도수를 저장할 HashMap class의 instance를 생성하고 ' getOrDefault() ' 메서드를 이용해 key(문자)-value(빈도수) 쌍을 저장한다
- 변수를 하나 생성하고 Math class의 ' max() ' 메서드를 이용해 최대 빈도수를 찾아 해당 값을 저장하고, 'a' 부터 'e'까지 일치하는 key가 있으면 매칭되는 value 값을 최대 빈도수에서 빼서 배열 [key - (int)'a']에 저장하면 된다
( 형 변환을 이용하자 )
해결 코드
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] result = new int[5];
HashMap<Character, Integer> chFreq = new HashMap<>();
for(char c : s.toCharArray()) {
chFreq.put(c, chFreq.getOrDefault(c, 0) + 1);
}
int maxFreq = 0;
for(char key : chFreq.keySet()) {
maxFreq = Math.max(maxFreq, chFreq.get(key));
}
for(int key = 'a'; key <= 'e'; key++) {
// 첫 번째 index에서부터 저장
result[key - (int)'a'] = maxFreq - chFreq.getOrDefault((char)key, 0);
}
return result;
}
}
▼ 정리
- " 형 변환 (Casting) " 을 사용하여 배열에서 원하는 위치에 해당하는 값을 쉽게 저장할 수 있었다
- ' Math.max() ' 메서드처럼 값을 비교해야 할 땐 Math class에 있는 메서드를 활용하자