문제 설명
프로그래머스 181855번 문자열 묶기
문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.
제한 사항
- 1 ≤
strArr의 길이 ≤ 100,000
- 1 ≤
strArr의 원소의 길이 ≤ 30
strArr의 원소들은 알파벳 소문자로 이루어진 문자열입니다.
입출력 예시
| strArr |
result |
| [“a”,”bc”,”d”,”efg”,”hi”] |
2 |
입출력 예 설명 1
- 각 문자열들을 길이에 맞게 그룹으로 묶으면 다음과 같습니다.
| 문자열 길이 |
문자열 목록 |
개수 |
| 1 |
[“a”,”d”] |
2 |
| 2 |
[“bc”,”hi”] |
2 |
| 3 |
[“efg”] |
1 |
코드 구현
Python
def solution(strArr):
numbers = [0] * 30
for num in strArr:
numbers[len(num) - 1] += 1
return max(numbers)
시간 복잡도 - Python
strArr 배열을 순회하므로 시간 복잡도는 $O(n)$이다.
- 문자열 길이 세기, 최댓값 찾기는 시간 복잡도가 각각 $O(1)$, $O(30)$이므로 $O(1)$이다.
개선할 점 - Python
Counter 함수를 사용하면 자동으로 길이별로 갯수를 세어준다.
def solution(strArr):
from collections import Counter
# 문자열 길이 카운트
length_counts = Counter(len(s) for s in strArr)
# 가장 큰 그룹의 크기 반환
return max(length_counts.values())
Java
class Solution {
public int solution(String[] strArr) {
int[] numbers = new int[30];
int answer = 0;
for (String s : strArr) {
numbers[s.length() - 1] += 1;
}
for (int num : numbers) {
if (num > answer) {
answer = num;
}
}
return answer;
}
}
시간 복잡도 - Java
strArr 배열을 순회하므로 시간 복잡도는 $O(n)$이다.
- 문자열 길이 세기, 최댓값 찾기는 시간 복잡도가 각각 $O(1)$, $O(30)$이므로 $O(1)$이다.
개선할 점 - Java
HashMap을 사용하면 문자열 길이별로 갯수를 셀 수 있다.
- 최댓값을 구하는 반복문을 없앨 수 있다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(String[] strArr) {
Map<Integer, Integer> lengthCounts = new HashMap<>();
int maxCount = 0;
for (String s : strArr) {
int length = s.length();
lengthCounts.put(length, lengthCounts.getOrDefault(length, 0) + 1);
maxCount = Math.max(maxCount, lengthCounts.get(length));
}
return maxCount;
}
}