[프로그래머스] Lv2. 메뉴 리뉴얼

2024. 6. 11. 20:41· Java/프로그래머스

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


풀이

 구현 문제인데, 구현도 구현이지만 자료 구조를 얼마나 잘 이해하고 쓰는지가 중요한 문제라고 생각했습니다.

 

 이 문제를 풀면서, 구현과 시간 초과를 내지 않기 위해 생각했던 중요한 포인트 두 가지는 조합을 구현하는 것과 Map 자료 구조를 사용하는 것이었습니다.

 

 조합을 구현할 때에, 손님을 순차적으로 돌며 손님이 주문한 메뉴 내에서만 조합을 통해 문자열을 찾아내었습니다.

 

 그리고 조합을 통해 나온 문자열이, 다른 손님이 주문한 메뉴에도 있는가? 를 파악하기 위해서 가장 처음에는 하나하나 다시 for문을 돌며 손님과 일치여부를 체크했다가 시간초과가 나는 바람에 생각을 다시 해보니, Map에 문자열을 key 값으로 저장하고 그 key값의 value를 ++ 해주면 되겠다고 생각했습니다.

 

아래는 소스 코드입니다.


소스 코드

import java.util.*;

class Solution {
    
    static HashMap<String, Integer> map;
    static int[] courseMax;
    static boolean[] selected;
    static int orderLen;
    static char[] order;
    static ArrayList<String> ans = new ArrayList<>();
    
    public String[] solution(String[] orders, int[] course) {
        String[] answer;
        
        courseMax = new int[course.length];
        map = new HashMap<>();
        
        for(int i = 0; i<orders.length;i++){
            order = orders[i].toCharArray();
            Arrays.sort(order);
            orderLen = order.length;
            
            for(int j = 0; j<course.length;j++){
                selected = new boolean[orderLen];
                comb(0,0,course[j], "", j);
            }
        }
        
        for(String s: map.keySet()){
            for(int j = 0; j<course.length;j++){
               if(courseMax[j]>1&&course[j]==s.length()&&courseMax[j]==map.get(s)){
                   ans.add(s);
               }
            }
        }
        Collections.sort(ans);
        
        answer = new String[ans.size()];
        for(int i = 0; i<ans.size();i++){
            answer[i] = ans.get(i);
        }
        
        return answer;
    }
    
    static void comb(int idx, int cnt, int N, String s, int j){
        if(cnt == N){
            map.put(s, map.containsKey(s)?map.get(s)+1:1);
            courseMax[j] = Math.max(courseMax[j], map.get(s));
        }
        else{
            for(int i = idx; i<orderLen;i++){
                comb(i+1, cnt+1, N, s+order[i], j);
            }
        }
    } 
}

'Java > 프로그래머스' 카테고리의 다른 글

[프로그래머스 / Java] Lv3. 표편집  (1) 2025.01.19
[프로그래머스] Lv 1. 키패드 누르기  (1) 2024.05.31
'Java/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 / Java] Lv3. 표편집
  • [프로그래머스] Lv 1. 키패드 누르기
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스택
  • 백준
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 네트워크
  • 인프런
  • 운영체제
  • 구현
  • 자바
  • 자바스크립트
  • JCF
  • OS
  • 이석복
  • 김영한
  • Java
  • 큐
  • 레디스
  • 한양대
  • 반효경
  • 프로그래머스
  • BOJ

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[프로그래머스] Lv2. 메뉴 리뉴얼
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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