본문 바로가기
Java/알고리즘

할인행사

by 티코딩 2023. 5. 26.

ㅇ 문제 정리

1) 하루에 한개씩 살수있는 할인품목 discount 리스트중 연속되는 want.length만큼과

2) 사고자하는 want리스트의 각 품목별 number만큼이 같은 경우의수를 구하는 문제.

 

ㅇ 나의 풀이법

내가 정리하면서 문제를 어떻게 풀려했는지를 알아보자.

1) discount를 연속해 10개씩 나누고 새로운 배열 darr에 넣는다.(10일 연속 일치할 경우라 그렇게 했다.)

2) 이걸 끝까지 반복한다.

3) darr에 want[j]가 몇갠지 세고 그게 number[j]와 같으면 cnt++

  3-1) 특정 배열에 특정 문자열이 몇갠지 세주는 count 메서드를 만들어줬다.

4) cnt와 want의 길이가 같으면 조건이 맞는 경우니 answer++

 

1. 첫번째 풀이다. 내가 여기서 한시간을 날렸다.(바보벙슨)

public static int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;

        //discount를 10개씩 슬라이싱 해서 새로운 배열 darr에다가 저장.
        for(int i = 0; i < discount.length-9; i++){
            String[] darr = Arrays.copyOfRange(discount, i, i+9);
            int cnt = 0;
            //darr 에서 want[i] 몇갠지 개수 센 다음, number[i]와 비교 하고, 전부 같으면 answer++
            for(int j = 0; j < want.length; j++){
                if(count(darr, want[j]) == number[j]){
                    cnt++;
                }
            }
            if(cnt == want.length){
                answer++;
            }
        }

        return answer;
    }
    public static int count(String[] array, String target) {
        return (int) Arrays.stream(array)
                .filter(str -> str.equals(target))
                .count();
    }
}

정말 바보같이 Arrays.copyOfRange()를 잘못썼다. 파라미터가 배열, 시작인덱스, 마지막인덱스 인데, 마지막인덱스를 i+9로 해서 자꾸 정답이 안나왔다. 나는 여기가 문젠지도 모른채 다른곳만 들쑤셨다. 분명 완벽한 계획인데 왜 안되지? 이러고 있었다.(바보) 문제를 깨닫고 다시 풀어보니 정답이었다.

2. 결국 고친 정답코드

public static int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;

        //discount를 10개씩 슬라이싱 해서 새로운 배열 darr에다가 저장.
        for(int i = 0; i <= discount.length-10; i++){
            String[] darr = Arrays.copyOfRange(discount, i, i+10); //하...이런실수를..
            int cnt = 0;
            //darr 에서 want[i] 몇갠지 개수 센 다음, number[i]와 비교 하고, 전부 같으면 answer++
            for(int j = 0; j < want.length; j++){
                if(count(darr, want[j]) == number[j]){
                    cnt++;
                }
            }
            if(cnt == want.length){
                answer++;
            }
        }

        return answer;
    }
    public static int count(String[] array, String target) {
        return (int) Arrays.stream(array)
                .filter(str -> str.equals(target))
                .count();
    }

이렇게 고치고 통과했다.

 

Arrays.copyOfRange() 는 알고리즘 풀면서 정말 많이 쓰는데 이 실수를 다시는 하지 말아야겠다는 교훈을 얻었다.

'Java > 알고리즘' 카테고리의 다른 글

올바른 괄호  (0) 2023.10.11
전화번호 목록  (0) 2023.06.07
캐시 - LRU(Least Recently Used)  (0) 2023.05.16
올바른 괄호  (0) 2023.04.20
최댓값과 최솟값  (0) 2023.04.18