Skip to main content

56. [Java] 문자열 묶기

https://school.programmers.co.kr/learn/courses/30/lessons/181855

  • 입력: 문자열 배열 strArr
  • 목표:
    • 문자열들을 길이별로 그룹으로 나눔
    • 그중에서 가장 많은 문자열이 있는 그룹의 크기를 retuirn

  • 1 ≤ strArr의 길이 ≤ 100,000
  • 1 ≤ strArr의 원소의 길이 ≤ 30
    • strArr의 원소들은 알파벳 소문자로 이루어진 문자열

정답코드

import java.util.*;

class Solution {
    public int solution(String[] strArr) {
        // 문자열 길이 key
        Map<Integer, Integer> lenCnt = new HashMap<>();
        
        for (String s : strArr) {
            int len = s.length();
            lenCnt.put(len, lenCnt.getOrDefault(len, 0) + 1);
        }
        
        // 제일 큰 그룹 크기
        int max = 0;
        for (int cnt : lenCnt.values()) {
            max = Math.max(max, cnt);
        }
        
        return max;
    }
}

문자열 길이를 key로 하고, 그 길이에 해당하는 개수를 세는 Map 문제이다.

  • Map<Integer, Integer>를 이용해서 문자열 길이별로 개수 카운트
  • 각 문자열의 길이를 기준으로 개수 누적
  • lengthCount에 저장된 값들 중 가장 큰 값을 찾아서 return

lengthCount
lenCnt.put(len, lenCnt.getOrDefault(len, 0) + 1);

위 코드는 Map<Integer, Integer> lenCnt에서 문자열 길이 len에 해당하는 값을 1씩 증가시키는 역할을 한다.
자바에서 자주 쓰이는 Map 누적 카운팅 패턴이다.

이걸 if문으로 풀어 쓰면 다음과 같다.

if (lenCnt.containsKey(len)) {
    int count = lenCnt.get(len);   // 이미 있으면 기존 값 가져오기
    lenCnt.put(len, count + 1);    // 1 증가시켜서 다시 저장
} else {
    lenCnt.put(len, 1);            // 없으면 1부터 시작
}
  • containsKey(len) : 해당 key가 이미 Map에 존재하는지 확인하기
  • get(len) : key에 해당하는 현재 값을 가져오기
  • put(len, 값) : key에 새로운 값을 저장하기

lenCnt.getOrDefault(len, 0)

getOrDefault(len, 0)Map에서 key가 len인 값을 가져오는 메서드이다. 이미 있는 문자열 길이면 개수를 가져오고, 만약 해당 key(len)가 존재하지 않으면, 기본값으로 0을 반환한다.


lenCnt.getOrDefault(len, 0) + 1
  • 현재 길이에 해당하는 문자열 개수에 1을 더한다는 뜻이다.