https://school.programmers.co.kr/learn/courses/30/lessons/72411
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
단품메뉴들의 조합을 만드는 문제이다.
직접적으로 조합을 사용해야 함을 언급한거 보니 조합을 써야겠다고 생각했다.
python같은 경우는 조합이 기본적으로 제공되지만 나는 java를 사용하기 때문에 직접 구현해보자
Map<String, Integer> counting;
int count = 0;
public String[] solution(String[] orders, int[] course) {
List<String> list = new ArrayList<>();
for (int i = 0; i < orders.length; i++) {
String order = orders[i];
String[] sortedOrder = order.split("");
Arrays.sort(sortedOrder);
StringBuilder builder = new StringBuilder();
for (String s : sortedOrder) {
builder.append(s);
}
orders[i] = builder.toString();
System.out.println(orders[i]);
}
for (int courseN: course) {
counting = new HashMap<>();
count = 0;
for (String order : orders) {
comb(order, "", 0, courseN);
}
System.out.println(count);
for (String key : counting.keySet()) {
if (counting.get(key) == count && count > 1) {
list.add(key);
}
}
}
list.sort(String::compareTo);
String[] answer = new String[list.size()];
answer = list.toArray(answer);
return answer;
}
public void comb(String order, String meal, int start, int courseN) {
if (meal.length() == courseN) {
counting.put(meal, counting.getOrDefault(meal, 0) + 1);
count = Math.max(counting.get(meal), count);
return;
}
for (int i = start; i < order.length(); i++) {
comb(order, meal + order.charAt(i), i + 1, courseN);
}
}
손님이 골랐던 메뉴 중 course 길이 만큼 조합해 이를 counting이라는 map에 저장한다.
map을 통해 해당 코스가 몇번 사용되었는지 확인했다.
그리고 count라는 변수를 통해 해당 길이 코스의 최대 빈도를 체크했다.
이를 통해 1번 이상이며 최대인 코스를 리스트에 추가해 반환했다.
주의할 점은 제공되는 order의 단품메뉴들이 오름차순이 아닐 수도 있다는 것인데 예시를 통해 쉽게 알 수 있어 정렬했다.
변수 이름이 뭔가 잘 생각이 나지 않았고
코드도 뭔가 더 최적화 할만한데 생각이 나지 않는다.
'Algorithm' 카테고리의 다른 글
| [1일 1CS] TCP (0) | 2026.03.17 |
|---|---|
| [프로그래머스] 동영상 재생기 풀어봄 (0) | 2025.01.16 |