Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- daily challenge
- BFS
- 프로그래머스 java
- Java
- 프로그래머스
- 리트코드
- 자바 5464
- 카카오
- java leetcode
- java 프로그래머스
- 백준
- 코딩테스트
- DP
- leetcode
- 리트코드 자바
- leetcode 1721
- 백준 18222
- 스택
- 파이썬
- 그래프 자바
- 자바
- 스프링 에러
- 코테
- 백준 16935
- dfs
- 자바 리트코드
- 인텔리제이 에러
- 구현
- 리트코드 1557
- 분할정복
Archives
- Today
- Total
레벨업 일지
[Java] 프로그래머스 이모티콘 할인 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=java#
풀이
최적화를 해서 풀까? 싶다가 나이브하게 brute force로 충분히 패스 가능한 시간복잡도를 가졌다.
로직은 다음과 같다.
- dfs 재귀 탐색으로 완탐한다.
- 각 레벨마다 4가지 할인율의 정보를 disInfo 배열에 담는다.
- 리프 노드에서 조건에 따른 사용자의 경우의 수를 따져 list에 추가한다.
- 모든 경우의 수 ( 가입자 수 , 판매액 ) 를 담은 배열을 가입자 수 기준 오름차순 정렬하고 리턴한다.
나이브한 풀이가 가능한 이유는 재귀 레벨의 최대 길이 = 7, 각 재귀마다 하는 행동 4
재귀마다 4번의 액션을 취함으로 4 ^ 7
리프 노드에서 for문 최대 개수 = 100 * 7 = 700
따라서 조합의 최대 수 = 700 * 4^7 < 1억 이다. (보통 연산횟수가 1억 넘어가면 tle라고 생각하면된다. )
따라서 브루트 포스로 구현하면 된다 .
코드
import java.util.*;
class Solution {
int dis[] = {10,20,30,40};
int userLen, emoLen;
ArrayList<int[]> ans ;
public int[] solution(int[][] users, int[] emoticons) {
ans = new ArrayList<>();
int[] answer ;
userLen= users.length;
emoLen = emoticons.length;
ans.add(new int[]{0,0});
//모든 경우의 수를 리스트에 담는다.
dfs(users,emoticons, new int[emoLen], 0 );
//리스트 소팅
Collections.sort(ans, (a,b)-> b[0]-a[0] == 0 ? b[1]-a[1] : b[0]-a[0]);
//답을 리턴한다.
return ans.get(0);
}
public void dfs(int[][] u, int[] e,int[] disInfo, int level){
if(level == emoLen){//종료 조건
int buyCnt = 0 ;
int buySum = 0;
for(int i = 0 ;i < userLen ;i++){
int sum = 0 ;
for(int j =0 ; j< emoLen; j++){
if(disInfo[j] >= u[i][0])
sum+= e[j]/100*(100-disInfo[j]);
}
if(sum >= u[i][1]){
buyCnt++;
}else{
buySum += sum;
}
}
ans.add(new int[]{buyCnt,buySum});
return;
}else{
for(int i = 0 ;i < 4 ;i++){
disInfo[level] = dis[i];
dfs(u,e,disInfo, level+1);
}
}
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 유전법칙 (0) | 2023.02.16 |
---|---|
[Java] 프로그래머스 올바른 괄호 (0) | 2023.02.14 |
[Java] 프로그래머스 미로 탈출 명령어 (0) | 2023.02.02 |
[Java] 프로그래머스 마법의 엘리베이터 (0) | 2023.01.30 |
[Java] 프로그래머스 택배 배달과 수거하기 (0) | 2023.01.29 |
Comments