https://school.programmers.co.kr/learn/courses/30/lessons/72411
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
public String[] solution(String[] orders, int[] course) {
for (int i = 0; i < orders.length; i++) {
StringBuilder stringBuilder = new StringBuilder();
char[] chars = orders[i].toCharArray();
Arrays.sort(chars);
stringBuilder.append(chars);
orders[i] = stringBuilder.toString();
}
List<String> results = new ArrayList<>();
// 코스 길이에 따라 조합 생성
for (int cutSize : course) {
Map<String, Integer> orderCount = new HashMap<>();
int max;
// 각 주문에서 조합 생성 (백트래킹)
for (String order : orders) {
if (order.length() >= cutSize) {
backtracking(order, "", 0, cutSize, orderCount);
}
}
// 최대 빈도 기반 결과 추가
max = orderCount.values().stream().max(Integer::compareTo).orElse(0);
if (max >= 2) {
for (Map.Entry<String, Integer> entry : orderCount.entrySet()) {
if (entry.getValue() == max) {
results.add(entry.getKey());
}
}
}
System.out.println(orderCount);
}
// 사전순 정렬 후 반환
Collections.sort(results);
return results.toArray(new String[0]);
}
private void backtracking(String order, String now, int index, int cutSize, Map<String, Integer> orderCount) {
if (now.length() == cutSize) {
orderCount.put(now, orderCount.getOrDefault(now, 0) + 1);
return;
}
for (int i = index; i < order.length(); i++) {
backtracking(order, now + order.charAt(i), i + 1, cutSize, orderCount);
}
}
📍포인트
1. 정렬까지는 하는 게 맞음. (map 특징상 AB, BA를 다르게 보는데 이러면 안 되기 때문에)
2. 코스 길이에 따른 조합 생성 (for문) 도 맞음
3. 각 주문 조합 생성 (for문) 도 맞음 → 이 단계에서 길이가 course의 각 요소보다 짧은지 판별
4. 백트래킹으로 로직을 진행시킴 → map에 모든 경우와 개수가 잘 쌓임
5. 최대 빈도를 가지면서 2번 이상 등장하고 최대값을 만족하는 조합만 반환 배열에 추가
📍삽질
1. 문제 이해는 빠르게 한 것 같은데 구현 단계에서 많이 힘들었다.
2. 완탐으로 접근하다가 점차 증가하는 for문 때문에 포기했다. 하지만 최대 course가 10까지 이므로 10중 for문을 쓰면 풀 수 있긴 하다.
3. 백트래킹 재귀를 이해하는데 상당한 시간이 걸렸다. 앞으로 이걸 어떻게 응용하지?
'코딩테스트' 카테고리의 다른 글
[코딩테스트(Java)] 프로그래머스 150370 개인정보 수집 유효기간 (1) | 2025.03.17 |
---|---|
[코딩테스트(Java)] 프로그래머스 118666 성격 유형 검사하기 (0) | 2025.03.16 |
[코딩테스트(Java)] 프로그래머스 67256 키패드 누르기 (0) | 2025.03.15 |
[코딩테스트(Java)] 프로그래머스 64061 크레인 인형뽑기 게임 (0) | 2025.03.14 |
[코딩테스트(Java)] 프로그래머스 81301 숫자 문자열과 영단어 (0) | 2025.03.13 |