250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • 카카오
  • certificate
  • 백준
  • uArm
  • BOJ
  • 선형대수
  • 알고리즘
  • Front-end
  • 브루트포스
  • Python
  • ADsP
  • java
  • 구현
  • 파이썬
  • 자바
  • 코딩테스트
  • 프로그래머스
  • SpringMVC
  • 문제풀이
  • JAVA8
  • AI
  • 개발
  • BFS
  • 머신러닝
  • ios
  • JPA
  • 개발자
  • data
  • swift
  • DP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim
CodingTest/Programmers

[PGM_72411] 메뉴 리뉴얼 (java)

[PGM_72411] 메뉴 리뉴얼 (java)
CodingTest/Programmers

[PGM_72411] 메뉴 리뉴얼 (java)

2022. 2. 4. 22:07
728x90
728x90

문제링크

https://programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
브루트포스

사람들의 주문내역이 입력으로 들어온다. 그 주문내역에서 함께 시킨 단품 메뉴들을 확인하여, 가장 많이 함께 시킨 메뉴들을 묶어 세트메뉴를 만들어주는 문제이다. 세트메뉴에 단품메뉴의 개수도 입력으로 주어지게 된다.

 

문제를 해결하기 위하여, 각 사람들이 메뉴를 n가지씩 뽑는 경우의 수를 모두 구하는 메소드를 구현하여주었다. 만약 세트 메뉴에 포함되는 단품의 개수가 2개라면 각 사람들이 주문한 내역을 확인하며 2개씩 묶이는 경우의 수를 모두 구해주고, 다른 사람이 이미 시킨 메뉴라면 값을 1 늘려주는 식으로 문제를 풀었다. 이 때 주의해야할 조건으로 최소 2명이 시킨 메뉴의 조합을 사용해주어야한다. 따라서, 한명이 시킨 메뉴의 조합이 최대라면 그 값은 배제해주어야한다.

 

그리고 마지막으로 다 구하고 나서는 정렬을 한번 하여 오름차순으로 결과값을 정리하여주었다.

구현코드

import java.util.*;

class Solution {
    public String[] solution(String[] orders, int[] course) {
        List<String> answer = new ArrayList<>();
        for(int i = 0; i < course.length; i++){
            Map<String, Integer> menu = new HashMap<>();
            for(int j = 0; j < orders.length; j++){
                boolean[] check = new boolean[orders[j].length()];

                String order = orders[j];
                char[] temp = new char[order.length()];
                for(int idx = 0; idx < temp.length; idx++)
                    temp[idx] = order.charAt(idx);
                Arrays.sort(temp);

                order = "";
                for(char c : temp){
                    order = order + c;
                }

                selectMenu(course[i],0,0,order,check,menu);
            }

            Integer[] values = menu.values().toArray(new Integer[0]);
            int max = Integer.MIN_VALUE;
            for(int val : values){
                if(val > max)
                    max = val;
            }

            if(max > 1) {
                String[] keys = menu.keySet().toArray(new String[0]);
                for (String key : keys) {
                    if (menu.get(key) == max)
                        answer.add(key);
                }
            }
        }

        Collections.sort(answer);
        return answer.toArray(new String[0]);
    }

    public void selectMenu(int menuCount, int selectedMenuCount, int start, String order,boolean[] check,Map<String, Integer> menu){
        if(selectedMenuCount == menuCount){
            String result = "";
            for(int i = 0; i < check.length; i++){
                if(check[i])
                    result = result + order.charAt(i);
            }
            if(menu.containsKey(result)){
                int cnt = menu.get(result) + 1;
                menu.put(result,cnt);
            }
            else
                menu.put(result,1);
            return;
        }

        for(int i = start; i < order.length(); i++){
            check[i] = true;
            selectMenu(menuCount,selectedMenuCount+1,i+1,order,check,menu);
            check[i] = false;
        }

    }
}
잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)

 

728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

[PGM_17677] 뉴스 클러스터링 (java)  (0) 2022.02.08
[PGM_60058] 괄호 변환 (java)  (0) 2022.02.07
[PGM_77485] 행렬 테두리 회전하기 (java)  (0) 2022.02.01
[PGM_12973] 짝지어 제거하기 (java)  (0) 2022.01.31
[PGM_43165] 타겟 넘버 (java)  (0) 2022.01.31
  • 문제링크
  • 문제풀이
  • 구현코드
'CodingTest/Programmers' 카테고리의 다른 글
  • [PGM_17677] 뉴스 클러스터링 (java)
  • [PGM_60058] 괄호 변환 (java)
  • [PGM_77485] 행렬 테두리 회전하기 (java)
  • [PGM_12973] 짝지어 제거하기 (java)
JinSeopKim
JinSeopKim
기록📚
Hello World!기록📚

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.