더북(TheBook)

014 빈도수가 가장 높은 문자 찾기

 

HashMap을 쓰면 쉽다. 이 해법은 다음 세 단계를 거친다.

1. 주어진 문자열의 문자들을 순회하면서 현재 문자를 키로, 현재까지의 빈도수를 값으로 하는 키-값 쌍을 HashMap에 넣는다.

2. HashMap의 최댓값, 즉 가장 높은 빈도수를 계산한다(Collections.max() 등을 사용한다).

3. HashMap 내 항목 집합을 순회하며 가장 높은 빈도수의 문자를 찾는다.

위 유틸리티 메서드는 빈도수가 가장 높은 문자와 그 빈도수를 포함하는 Pair<Character, Integer>를 반환한다(이때 여백은 제외한다). Pair라는 클래스를 사용하지 않으려면 Map.Entry<K, V>를 사용한다.

public static Pair<Character, Integer> maxOccurenceCharacter(String str) {
  Map<Character, Integer> counter = new HashMap<>();
  char[] chStr = str.toCharArray();

  for (int i = 0; i < chStr.length; i++) {
    char currentCh = chStr[i];
    if (!Character.isWhitespace(currentCh)) { // 여백은 제외
      Integer noCh = counter.get(currentCh);
      if (noCh == null) {
        counter.put(currentCh, 1);
      } else {
        counter.put(currentCh, ++noCh);
      }
    } 
  }

  int maxOccurrences = Collections.max(counter.values());
  char maxCharacter = Character.MIN_VALUE;

  for (Entry<Character, Integer> entry: counter.entrySet()) {
    if (entry.getValue() == maxOccurrences) {
      maxCharacter = entry.getKey();
    }
  }

  return Pair.of(maxCharacter, maxOccurrences);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.