Algorithm

그리디 - 큰 수 구하기

향각산 2022. 1. 4. 22:59

n, m, k 세 개의 값을 받아서

n 만큼의 숫자를 배열에 담고, m 번 만큼 숫자를 나열하는데 한 숫자당 연달아 k만큼 가능하다.

 

n = 5, m = 5, k = 2

n = { 1, 2, 3, 4, 5} 

 

가장 큰 수의 조합은 5 5 4 5 5 형태가 된다.

 

   @Test
    void 그리디_큰수구하기() {
        // 같은 숫자를 연달아 k번 반복가능, m만큼 나열했을때 가장 큰수
        int m = 8;
        int k =3;

        /**
         * 만약 값을 입력받는다면 List로 받아서 Collections 정렬을 하자.
         * 배열로 받아서 Arrays.sort는 reverseOrder가 까다로움.
         */

        List<Integer> list = Lists.newArrayList(2, 6, 4, 5, 4);
        list.sort(Collections.reverseOrder());
        System.out.println(list);


        /**
         * 1번 내 풀이
         * 큰 수를 정렬 후 (8/3)*3*첫번째 큰 수 + (8%2)*두번째 큰수 = 제일 큰 수 조합
         */
        System.out.println(list.get(1) * (m % k) + list.get(0) * (m / k)  * k);

        /**
         *  2번 풀이
         *  (m / (k + 1)) * (첫째 수 * k + 두번째 큰수) + (m % (k + 1) * 첫째 수)
         */
        int front = (list.get(0) * k) + list.get(1);
        int count = m / (k + 1);

        int back = (m % (k + 1)) * list.get(0);

        System.out.println(front * count + back);
    }

 

문제가 너무 간단한거라 깊게 생각하지 않았다.

다만 2번 풀이 정답을 보고 내가 생각한 정답보다 규칙을 잘 만들었다는 느낌을 받았다.

나는 그냥 감으로 풀었다고 가정하면, 2번 풀이는 K+1과 같이 규칙을 새로 만들어서 그걸 적용한 느낌?

 

'Algorithm' 카테고리의 다른 글

그리디 - 숫자 카드 게임  (0) 2022.01.05
종만북이 설명하는 알고리즘 풀이 순서  (0) 2021.06.29
Hash - 1  (0) 2021.06.08
[C++] 소문자 대문자 변형  (0) 2019.04.25
부분수열 (Subsequence)  (0) 2019.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함