ACM준비/Programmers

이모티콘 할인행사

조규현15 2023. 5. 12. 23:33
반응형

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

 

프로그래머스

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

programmers.co.kr

입력 파라미터 값의 제한을 보고 시간 복잡도를 걱정할 문제라고 생각이 안들었다.

시간 복잡도가 필요하다면 좋은 아이디어로 접근해야 한다.

 

문제 풀이는 전체 경우의 수 ( 최대 4^7 ) 의 케이스에서 Best 를 찾아본다.

 

할인율은 10, 20, 30, 40 ( 총 4 개 ) 의 케이스이기에 n 개의 이모티콘의 경우의 수를 만들고 ( N )

유저의 수 ( N ) 에서 이모티콘의 구입과 서비스 가입 유무를 판단한다.

 

비용은 N^2 * 4 로 할인율이 정해지지 않았다면 어려웠을 풀이 접근이다.

function solution(users, emoticons) {
    var discountCase = [0.9, 0.8, 0.7, 0.6];
    var answer = [0, 0];

    var emoticon_count = emoticons.length;
    // 4 ^ n ( n <= 7 )
    var total_count = discountCase.length ** emoticon_count;

    // generate sample '[0, 0, 0, 0 ...]'
    for(var i = 0; i < total_count; i++) {
        var j = i;

        var sample = new Array(emoticon_count);
        var sample_idx = emoticon_count;
        // 10 digit -> 4 digit
        while (j > 0) {
            sample[--sample_idx] = j % 4;
            // division by '4'
            j = j >> 2;
        }
        while (sample_idx > 0) {
            sample[--sample_idx] = 0;
        }

        var sample_result = [0, 0];
        users.forEach(user => {
            var [discount, budget_service_cash] = user;

            var discount_margin = (discount / 10) - 1;
            var total_cash = 0;
            for (var i = 0; i < emoticon_count; i++) {
                if (sample[i] >= discount_margin) {
                    total_cash += emoticons[i] * discountCase[sample[i]];
                }
            }

            if (total_cash >= budget_service_cash) {
                sample_result[0] += 1;
            } else if (total_cash > 0) {
                sample_result[1] += total_cash;
            }
        });

        if((sample_result[0] > answer[0]) 
        || (sample_result[0] == answer[0] && sample_result[1] > answer[1])) {
            answer = sample_result;
        }
    }
    
    return answer;
}
반응형

'ACM준비 > Programmers' 카테고리의 다른 글

표 병합  (0) 2023.05.16
표현 가능한 이진트리  (0) 2023.05.15
택배 배달과 수거하기  (0) 2023.05.11
개인정보 수집 유효기간  (0) 2023.05.10
올바른 괄호의 갯수  (0) 2023.01.09