Scroll indicator done
728x90

문제 링크

가장 큰 수

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

 

프로그래머스

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

programmers.co.kr

메뉴 리뉴얼

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

 

프로그래머스

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

programmers.co.kr


전체 코드

package com.example.javaproject3.psstudy;

import java.util.Arrays;
import java.util.Comparator;

public class Solution42746 {
    public String solution(int[] numbers) {
        // int형 배열을 String 형 배열로 변환
        String[] arr = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) arr[i] = String.valueOf(numbers[i]);
        Arrays.sort(arr, new Comparator<String>() {  // String 배열을 내림차순 정렬 ( 9와 30을 비교했을 때, 930 > 309 이므로, 9, 30 순으로 정렬됨 )
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });
        if(arr[0].equals("0")) return "0";  // 내림차순으로 정렬한 상태이기 때문에, 맨 앞의 값이 0이면, 0 리턴
        return String.join("", arr);  // 배열을 join 으로 연결해 문자열로 리턴
    }

    public static void main(String[] args) {
        Solution42746 solution42746 = new Solution42746();
        solution42746.solution(new int[]{3, 30,34, 5, 9});
    }
}
package com.example.javaproject3.psstudy;

import java.util.*;

public class Solution72411 {
    public HashMap<String, Integer> map;  // <코스 요리 조합, 주문 횟수 >

    public String[] solution(String[] orders, int[] course) {
        ArrayList<String> answer = new ArrayList<>();
        for (int i = 0; i < orders.length; i++) {  // 문자열 오름차순 정렬 ( ex. WXA 같은 경우 위해 )
            char[] charArr = orders[i].toCharArray();  // 문자형 배열로 변환하여
            Arrays.sort(charArr);  // 정렬
            orders[i] = String.valueOf(charArr);  // 다시 문자열로 변환해 저장
        }

        for (int c : course) {  // 코스의 길이 만큼 조합을 구함
            map = new HashMap<>();  // 조합 수 카운팅
            int max = 0;

            for (String order : orders) {  // 각 주문마다 조합 탐색
                StringBuilder sb = new StringBuilder();  // 주문 조합할 StringBuilder 변수 선언
                if (c <= order.length())  // 탐색할 코스 요리 개수보다 주문한 요리 개수가 더 클 때
                    combination(order, sb, 0, 0, c);  // 조합을 구하는 메소드 호출
            }

            for (String key : map.keySet())  // map 의 코스 조합 ketSet 을 반복하여 가장 많이 주문된 횟수 탐색
                max = Math.max(max, map.get(key));  // key 에 따른 value 값과 max 값 중 큰 값을 max 에 저장

            for (String key : map.keySet()) {  // 최소 2번 이상 주문된 조합이고 가장 많이 주문한 횟수와 일치하는 조합은 Arraylist 에 추가
                int value = map.get(key);  // 코스 조합에 따른 주문 횟수 값
                if(value > 1 && max == value) answer.add(key);
            }
        }

        Collections.sort(answer);  // 코스 요리 조합 Arraylist 정렬
        return answer.toArray(new String[answer.size()]);  // String 배열로 변환하여 리턴
    }

    // str : 주문 메뉴 구성
    // sb : 조합을 구할 StringBuilder
    // idx : 조합할 때 주문 메뉴를 위한 index
    // cnt : 코스 요리 개수 카운트
    // n : 코스 요리 개수
    public void combination(String str, StringBuilder sb, int idx, int cnt, int n) {
        if (cnt == n)  //  코스 요리 개수만큼 조합이 되면
            map.put(sb.toString(), map.containsKey(sb.toString()) ? map.get(sb.toString()) + 1 : 1);  // map 에 해당 조합이 있으면  기존 주문 횟수에 +1, 없으면 1로 map에 저장
        else {
            for (int i = idx; i < str.length(); i++) {  // idx부터 시작해서 조합을 구함
                sb.append(str.charAt(i)); // sb 에 주문 메뉴 한 문자씩 붙여나감
                combination(str, sb, i + 1, cnt + 1, n);  // 재귀 호출
                sb.delete(cnt, cnt + 1);  // 해당 요리에 대한 조합은 계산되었기 때문에 sb 에 붙였던 요리 메뉴 삭제
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Solution72411 solution72411 = new Solution72411();
        System.out.println(Arrays.toString(solution72411.solution(new String[]{"XYZ", "XWY", "WXA"}, new int[]{2, 3, 4})));
    }
}
728x90