Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링
- 완도산회
- Spring
- 맛집
- 쓰레드 풀
- BFS
- 문자열 압축
- 프로그래머스
- 양꼬치
- 고모네 콩탕
- 설탕 배달
- Servlet
- 맛집 투어
- 1로 만들기
- 다이나믹 프로그래밍
- 호유동
- HTTP API
- 서블릿
- 포두부 보쌈
- 백준
- dp
- mvc
- 2589
- 스프링 MVC
- 2839
- 알고리즘
- 2638
- 동적 프로그래밍
- 2020 KAKAO BLIND
- 투어
Archives
- Today
- Total
프로그래밍 공방
[프로그래머스] 메뉴 리뉴얼 본문
문제
programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
문제해결방법
이 문제는 course 길이별로 order 문자들을 조합해서 각 길이별로 제일 많이 나온 조합을 찾는 문제였다.
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | package Programmers; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.PriorityQueue; class Menu { String name; int count; Menu(String name, int count) { this.name = name; this.count = count; } } public class Solution_메뉴리뉴얼 { public static boolean[] v = new boolean[20]; public static Map<String, Integer> map = new HashMap<String, Integer>(); public static void comb(String menu, int before, int count, int courseCount, String order) { if(count>=courseCount) { if(map.containsKey(menu)) map.put(menu, map.get(menu)+1); else map.put(menu, 1); return; } for(int i=before+1; i<order.length(); i++) { if(!v[i]) { v[i] = true; comb(menu+order.charAt(i), i, count+1, courseCount, order); v[i] = false; } } } public static String sortString(String s) { char[] ch = s.toCharArray(); Arrays.sort(ch); StringBuilder sb = new StringBuilder(); for(int i=0; i<ch.length; i++) sb.append(ch[i]); return sb.toString(); } public static String[] solution(String[] orders, int[] course) { PriorityQueue<Menu> pq = new PriorityQueue<Menu>(new Comparator<Menu>() { @Override public int compare(Menu arg0, Menu arg1) { return Integer.compare(arg1.count, arg0.count); } }); List<String> list = new ArrayList<String>(); for(int i=0; i<orders.length; i++) orders[i] = sortString(orders[i]); for(int i=0; i<course.length; i++) { for(int j=0; j<orders.length; j++) { if(orders[j].length()<course[i]) continue; comb("", -1, 0, course[i], orders[j]); } int max = Integer.MIN_VALUE; for(String key : map.keySet()) { int count = map.get(key); if(max<=count) { max = count; pq.add(new Menu(key, count)); } } while(max!=1 && !pq.isEmpty()) { Menu menu = pq.poll(); if(menu.count==max) list.add(menu.name); else break; } pq.clear(); map.clear(); } String[] answer = new String[list.size()]; for(int i=0; i<list.size(); i++) answer[i] = list.get(i); Arrays.sort(answer); return answer; } public static void main(String[] args) { String[] orders = {"ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"}; int[] course = {2, 3, 4}; String[] answer = solution(orders, course); for(int i=0; i<answer.length; i++) System.out.println(answer[i]); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[프로그래머스] 실패율 (0) | 2021.02.10 |
---|---|
[프로그래머스] 다트 게임 (0) | 2021.02.10 |
[백준] 5676번 : 음주 코딩 (0) | 2021.02.05 |
[프로그래머스] 순위 검색 (0) | 2021.02.04 |
[백준] 14425번 : 문자열 집합 (0) | 2021.02.02 |