Mini
[틀림] 프로그래머스 메뉴리뉴얼 // 자바, 람다, 해시 본문
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]);
}
}'Algorithm > 구현' 카테고리의 다른 글
| [구현] 프로그래머스 방문길이 // set (1) | 2025.07.03 |
|---|---|
| [세모] 프로그래머스 가장많이 받은 선물 // 구현, 해시맵, 문자열을 인덱스로 (0) | 2025.05.11 |
| [틀림] 백준 16235 나무제테크 // 구현, 배열에 여러정보필요한경우, 삭제보다는 새로할당 (0) | 2025.03.18 |
| [세모] 백준 1269 대칭차집합 // 카운팅스타? 맵또는 배열 (0) | 2025.03.08 |
| [틀림] [알고리즘] 백준 15685 드래곤 커브 // 구현, 기하문제는 규칙을 찾아라 (0) | 2025.02.16 |