Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Mini

[틀림] 프로그래머스 메뉴리뉴얼 // 자바, 람다, 해시 본문

Algorithm/구현

[틀림] 프로그래머스 메뉴리뉴얼 // 자바, 람다, 해시

Mini_96 2025. 8. 8. 02:06

https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

* c++ 풀이

freq[길이] 별 map이 키포인트

과거에 머리가 더 잘돌아갔네..

#include <bits/stdc++.h>

using namespace std;

map<string,int> freq[11];

vector<string> solution(vector<string> orders, vector<int> course) {
    vector<string> answer;
    map<string, int> m; //코스이름, 등장횟수
    
    for(auto order : orders){ //ABCFG
        sort(order.begin(),order.end());
        for(int subset=1;subset<(1<<order.size());++subset){ // A, AB, ABC, ...
            string menu;
            for(int j=0;j<order.size();++j){
                if(subset & (1<<j)) menu+=order[j];
            }
            freq[menu.size()][menu]++;
        }
    }
    
    vector<string> ans;
    for(auto i : course){
        int mxfreq=0;
        for(auto p : freq[i])
            mxfreq=max(mxfreq,p.second);
        if(mxfreq<2) continue;
        for(auto p : freq[i]){
            if(p.second==mxfreq) ans.push_back(p.first);
        }
    }

    sort(ans.begin(),ans.end());
    return ans;
}

 

* 자바풀이

람다지옥

람다연습 // .map을 하면 유사 배열 stream이 되는군

주문을 정렬해야함에 주의.

subset & (1<<i) 기억 // 비트켜져있는지 하나씩 검사

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public String[] solution(String[] orders, int[] course) {
        
        var m1 = new HashMap<String, Integer>(); // <조합, 등장횟수>
        
        for(var order : orders) {
            // 각 주문을 정렬하여 일관성 보장
            char[] chars = order.toCharArray();
            Arrays.sort(chars);
            String sortedOrder = new String(chars);
            
            int n = sortedOrder.length();
            
            // 모든 부분집합 생성 (공집합 제외)
            for(int subset = 1; subset < (1 << n); subset++) {
                var sb = new StringBuilder();
                
                for(int i = 0; i < n; i++) {
                    if((subset & (1 << i)) > 0) {
                        sb.append(sortedOrder.charAt(i));
                    }
                }
                
                String combination = sb.toString();
                
                m1.put(combination, m1.getOrDefault(combination, 0) + 1);
                // course 배열에 포함된 길이만 고려 (없어도 통과하긴함)
                // if(Arrays.stream(course).anyMatch(c -> c == combination.length())) {
                //     m1.put(combination, m1.getOrDefault(combination, 0) + 1);
                // }
            }
        }
        
        var answer = new ArrayList<String>();
        
        // 각 코스 길이별로 처리
        for(int courseLength : course) {
            // 해당 길이의 조합들 중 최대 빈도 찾기
            int maxCount = m1.entrySet().stream()
            .filter(e -> e.getKey().length() == courseLength)  // "AB":3, "BC":2, "AC":3
            .filter(e -> e.getValue() >= 2)         // "AB":3, "BC":2, "AC":3 (모두 2 이상)
            .mapToInt(Map.Entry::getValue)          // [3, 2, 3]
            .max()                                  // OptionalInt[3]
            .orElse(0);                            // 3
            
            // 최대 빈도를 가진 모든 조합 추가
            if(maxCount >= 2) {
                m1.entrySet().stream()
                    .filter(e -> e.getKey().length() == courseLength) // "AB":3, "BC":2, "AC":3
                    .filter(e -> e.getValue() == maxCount)           // "AB":3,"AC":3 (maxCount=3)
                    .map(Map.Entry::getKey)                          // ["AB", "AC"]
                    .forEach(answer::add);
            }
        }
        
        Collections.sort(answer);
        return answer.toArray(new String[0]);
    }
}