been_dev
been_archive
been_dev
전체 방문자
오늘
어제
  • 분류 전체보기 (34)
    • f-lab (3)
    • project (2)
    • solve (29)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • JWT
  • Lombok
  • 탐욕법
  • 문자열
  • 버튼미노출
  • 프로그래머스
  • 후기
  • 백준
  • 에프랩 1개월 후기
  • 에프랩 2개월 후기
  • 자바 백엔드
  • 큐
  • 이진변환반복하기
  • 해시
  • 숫자의표현
  • Downloading from external resources is disabled
  • 자바
  • f-lab 1개월 후기
  • 스택
  • MYSQL
  • 코딩테스트
  • jadencase만들기
  • 에프랩
  • f-lab
  • f-lab 2개월 후기
  • Eclipse
  • specify location
  • 실행창 작음
  • 완전탐색
  • 그리디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
been_dev

been_archive

solve

[프로그래머스/해시] Lv2. 메뉴 리뉴얼 (자바)

2024. 1. 11. 10:36

해시

1. 조합을 만들 땐 정렬을 고려하자

2. HashMap 의 기본 형태는 name : count

3. 재귀 - 탈출조건 + 수행 동작

 

import java.util.*;

// 1. 각 길이 별로 가능한 모든 조합 생성
// 2. 조합 별 개수를 저장하고, 가장 많은 조합만 저장 
class Solution {
    
    List<String> answerList = new ArrayList();
    Map<String, Integer> hashMap = new HashMap();
    
    public String[] solution(String[] orders, int[] course) {
        // 1. 각 order 정렬
        for(int i=0; i<orders.length; i++) {
            char[] arr = orders[i].toCharArray();
            Arrays.sort(arr);
            orders[i] = String.valueOf(arr);
        }
        
        // 2. 각 order 기준으로 courseLength 만큼의 조합 만들기
        for(int courseLength : course) {
            for(String order : orders) {
                combination("", order, courseLength); // 재귀
            }
            
            // 3. 가장 많은 조합을 answer 에 저장한다.
            if(!hashMap.isEmpty()) {
                List<Integer> countList = new ArrayList<>(hashMap.values()); 
                int max = Collections.max(countList);

                if(max >1) {
                    for(String key : hashMap.keySet()) {
                        if(hashMap.get(key) == max) {
                            answerList.add(key);
                        }
                    }
                }
                hashMap.clear(); // 코스 길이 별로 찾아야하므로 초기화
            }
        }
        
        Collections.sort(answerList);
        String[] answer = new String[answerList.size()];
        for(int i=0; i< answer.length; i++) {
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
    
    // order 기준으로 courseLength 만큼의 조합 만들기
    // order : 현재까지 조합된 코스
    // others : 아직 사용되지 않은 메뉴
    // count : 코스 길이
    public void combination(String order, String others, int count) {
        // 탈출조건 : count 가 0 이 되었을 때
        if(count == 0) {
            hashMap.put(order, hashMap.getOrDefault(order, 0) + 1);
            return;
        }
        
        // 수행동작 : 0 부터 남은 메뉴들의 length 까지 조합한다.
        for(int i=0; i<others.length(); i++) {
            combination(order + others.charAt(i), others.substring(i+1), count-1);
        }
        
    }
}

 

출처: https://coding-grandpa.tistory.com/102 [개발자로 취직하기:티스토리]

'solve' 카테고리의 다른 글

[프로그래머스/해시] Lv1. 신고 결과 받기(자바)  (0) 2024.01.11
[프로그래머스/해시] Lv2. 순위 검색 (자바)  (1) 2024.01.11
[프로그래머스/그리디] Lv1. 키패드 누르기(자바)  (1) 2024.01.10
[프로그래머스/그리디] Lv1. 체육복(자바)  (0) 2024.01.09
[프로그래머스/완전탐색] Lv2. 소수 찾기 (자바)  (0) 2024.01.09
    'solve' 카테고리의 다른 글
    • [프로그래머스/해시] Lv1. 신고 결과 받기(자바)
    • [프로그래머스/해시] Lv2. 순위 검색 (자바)
    • [프로그래머스/그리디] Lv1. 키패드 누르기(자바)
    • [프로그래머스/그리디] Lv1. 체육복(자바)
    been_dev
    been_dev

    티스토리툴바