[프로그래머스 JAVA] 150368. 이모티콘 할인행사

2026. 5. 8. 06:41·코딩테스트/프로그래머스

문제 링크


 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

접근 방법


각 이모티콘은 10%, 20%, 30%, 40% 중 하나의 할인율을 가질 수 있습니다.
이모티콘의 개수가 최대 7개이므로 가능한 할인 조합의 수는 최대 4^7 = 16,384개입니다.
따라서 모든 할인율 조합을 dfs로 확인해도 충분히 해결할 수 있습니다.

소스 코드


class Solution {

    int maxSum = 0, maxPlusUser = 0;
    int[] userSum;

    void recursive(int idx, int[][] users, int[] emoticons) {
        if (emoticons.length == idx) {
            int sum = 0, plusUser = 0;
            for (int i = 0; i < users.length; i++) {
                if (users[i][1] <= userSum[i]) {
                    plusUser++;
                } else {
                    sum += userSum[i];
                }
            }

            if (maxPlusUser < plusUser) {
                maxPlusUser = plusUser;
                maxSum = sum;
            } else if (maxPlusUser == plusUser && sum > maxSum) {
                maxSum = sum;
            }

            return;
        }

        for (int i = 90; i > 50; i -= 10) {
            for (int j = 0; j < users.length; j++) {
                if (users[j][0] >= i) {
                    userSum[j] += emoticons[idx] * i;
                }
            }

            recursive(idx + 1, users, emoticons);

            for (int j = 0; j < users.length; j++) {
                if (users[j][0] >= i) {
                    userSum[j] -= emoticons[idx] * i;
                }
            }
        }
    }

    public int[] solution(int[][] users, int[] emoticons) {
        userSum = new int[users.length];

        for (int i = 0; i < users.length; i++) {
            users[i][0] = 100 - users[i][0];
        }

        for (int i = 0 ; i < emoticons.length; i++) {
            emoticons[i] /= 100;
        }

        recursive(0, users, emoticons);
        return new int[]{maxPlusUser, maxSum};
    }
}

코드 설명


maxPlusUser는 현재까지 찾은 최대 이모티콘 플러스 가입자 수를 저장합니다.
maxSum은 가입자 수가 같을 때 비교할 최대 판매액을 저장합니다.
userSum은 현재 할인율 조합에서 각 유저가 구매한 이모티콘 금액의 합을 저장합니다.

 

먼저 유저의 기준 할인율을 결제 비율 기준으로 변환합니다.
예를 들어 기준 할인율이 40%라면 100 - 40 = 60으로 바꿉니다.
이 값은 정가의 60% 이하로 구매할 수 있는 경우, 즉 40% 이상 할인되는 경우에만 구매한다는 의미입니다.

이모티콘 가격은 모두 100의 배수이므로 미리 100으로 나눕니다.
이렇게 하면 재귀 내부에서 emoticons[idx] * i / 100처럼 매번 나누기 연산을 하지 않고, emoticons[idx] * i만으로 할인가를 계산할 수 있습니다.

 

recursive()는 현재 idx번째 이모티콘의 할인 후 결제 비율을 선택합니다.
반복문에서 i는 90, 80, 70, 60으로 변하며, 각각 10%, 20%, 30%, 40% 할인을 의미합니다.

각 유저에 대해 users[j][0] >= i이면 해당 이모티콘을 구매합니다.
예를 들어 유저 기준 할인율이 25%라면 변환 후 값은 75입니다.
현재 할인율이 30%라면 결제 비율은 70이므로 75 >= 70이 되어 구매합니다.
현재 할인율이 20%라면 결제 비율은 80이므로 75 >= 80이 거짓이 되어 구매하지 않습니다.

재귀 호출 전에는 현재 이모티콘 구매 금액을 userSum에 더합니다.
재귀 호출이 끝난 뒤에는 같은 값을 다시 빼서 이전 상태로 되돌립니다.

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

[프로그래머스 JAVA] 258707. n + 1 카드게임  (0) 2026.05.02
[프로그래머스 JAVA] 17686. [3차] 파일명 정렬  (0) 2026.04.27
[프로그래머스 JAVA] 68936. 쿼드압축 후 개수 세기  (0) 2026.04.23
[프로그래머스 SQL] 301649. 대장균 크기에 따라 분류하기 2  (0) 2026.04.09
[프로그래머스 SQL] 131114. 경기도에 위치한 식품창고 목록 출력하기  (0) 2026.04.07
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 JAVA] 258707. n + 1 카드게임
  • [프로그래머스 JAVA] 17686. [3차] 파일명 정렬
  • [프로그래머스 JAVA] 68936. 쿼드압축 후 개수 세기
  • [프로그래머스 SQL] 301649. 대장균 크기에 따라 분류하기 2
tkxx_ls
tkxx_ls
  • tkxx_ls
    tkxx_ls Story
    tkxx_ls
  • 전체
    오늘
    어제
    • 분류 전체보기 (117) N
      • 코딩테스트 (56) N
        • 백준 (40)
        • 프로그래머스 (16) N
      • 42Seoul (6)
        • libft (6)
      • Github (1)
      • 환경설정 (1)
        • 기타 (4)
        • c & c++ (3)
      • 잡설 (2)
      • CS (7)
        • 네트워크 (2)
        • 강화 학습 (4)
        • 자료구조 (8)
        • 알고리즘 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BOJ
    구현
    프로그래머스
    java build
    Baekjoon
    백트래킹
    gradle tool chain
    백준
    java 버전 호환성
    문자열 처리
    Gradle 설정
    build 재현성
    강화학습
    dfs
    분할정복
    c++
    알고리즘
    jdk 버전 관리
    programmers
    Java
    완전탐색
    인공지능
    gradle
    cs
    자료구조
    브루트포스
    java tool chain
    머신러닝
    gradle java 설정
    신경망
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
tkxx_ls
[프로그래머스 JAVA] 150368. 이모티콘 할인행사
상단으로

티스토리툴바