알고리즘/프로그래머스 Level2

[프로그래머스, Java] Level2: 할인 행사

류창 2022. 10. 13. 15:51
반응형

 

문제분석:

 

간단하게 요약하자면,   정현이가 원하는 10개의 상품이 10일 연속으로 할인을 하는 구간의 갯수를 구하는 문제다.

 

 

 

문제의 할인 상품의 배열의 길이는  10만개다.

 

요즘엔, 문제 풀기전부터  최적화, 효율성 좋은 코드를 뽑으려고 고민하다

오히려 푸는 시간이 더 오래걸리는것같다.

 

정작 이런 생각은 코딩테스트 가면 진짜 독이 될수 있다..  

 

 

첫번째 접근으로,  Queue 를 사용해보고자했다.

 

그이유는, 매번 10개의 할인구간이  하루가 지날때마다 바뀌는데,

 

그 할인구간을 매번 바꾸는것보다,  가장 오래된 원소를 빼고,  가장 최근의 원소를 추가하는 

(선입 선출 알고리즘을 사용하면) 최적화 방식을 생각했다.

 

-> 오히려 더 복잡하고..  복잡하다보니 코드 오류가 좀 많이떳다.

 

 

 

결국, 처음으로 돌아와  쉽게 짜기로 생각했다.

 

두번째 접근으로,  Arrays의 메소드를 사용하여 짯다.

 

할인의 구간은  Arrays.copyOfRange()를 사용하여 자르고,

 

정현이의  원하는 리스트는  새롭게 Array를 생성하여 그냥 2개를 비교하는 최적화 생각안하고 간단하게 짯다.

 

생각보다 맥없이 풀리는거보고 조금..  허탈했다   

괜히 시작하자마자 최적화 하겟다고  시간을 낭비한것이 정말 아쉽다.

 

언제 최적화를 먼저 생각할지,  기능구현을 우선할지 이부분이 중요할것같다.

 

 

전체 문제풀이:

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
import java.util.*;
class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
 
        List<String> list= new ArrayList<>();
        
        for(int i =0;i<want.length;i++){
            for(int j=0;j<number[i];j++){
                list.add(want[i]);
            }
        }
        
        Collections.sort(list);
        String[] arr = list.toArray(new String[10]);
        
        for(int i=0;i<=discount.length-10;i++){
            String[] copy = Arrays.copyOfRange(discount,i,10+i);
            Arrays.sort(copy);
            if(Arrays.equals(arr,copy)){
                answer++;
            }
        }
        return answer;
    }
}
cs
반응형