할인 행사 (자바)

김재현·2023년 12월 22일
0

알고리즘 풀이

목록 보기
64/90

문제

정답 코드

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        
        int sumNum = 0;
        for (int num : number) {
            sumNum+=num;
        }

        // 회원등록 할지말지 고민 할 수 있는 날짜
        int compDays = discount.length - sumNum + 1;

        // 원하는 목록이 횟수만큼 모두 담긴 wantAll을 만듦
        String[] wantAll = new String[sumNum];
        int index=0;
        for (int i=0;i<want.length;i++) {
            for (int j=0;j<number[i];j++) {
                wantAll[index]=want[i];
                index++;
            }
        }
        
        for (int k=0;k<compDays;k++) {  // 회원가입 할지 비교
            int cnt = 0;
            String[] copy = wantAll.clone();  // 같으면 ""로 바꿔주면서 비교하려고 깊은복사 
            for (int i = k; i < k+sumNum; i++) {   // discount와 비교, 시작 위치
                for (int j = 0; j < copy.length; j++) {  // 원하는 물품인지 비교
                    if (discount[i].equals(copy[j])) {
                        copy[j] = "";
                        cnt++;
                        break;
                    }
                }
            }
            if (cnt==sumNum) answer++;  
        }
        
        return answer;
    }
}

처음에 어떻게 풀어야할지 눈에 보였던 문제.

배열을 만들어서 discount와 확인한다음, 있으면 삭제시키며 비교한다.

이걸 더 빠르고 간단하게 나타낼 수 있을 것 같은데,
contains로 어떻게 쓸 수 있는 방법이 있을까? 라고 생각하며 다른 사람 풀이를 확인해봤는데, 쓰신분이 있었다.

다른 사람 풀이

import java.util.*;

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        ArrayList<String> list = new ArrayList<>();

        for (int i=0; i<want.length; i++) {
            while (number[i]-- > 0) {
                list.add(want[i]);
            }
        }

        for (int i=0; i<discount.length-list.size()+1;i ++) {
            ArrayList<String> l = (ArrayList<String>) list.clone();
            for (int j=i; j<i+list.size(); j++) {
                if (l.contains(discount[j])) {
                    l.remove(discount[j]);
                } else {
                    break;
                }
            }
            answer += l.size()==0 ? 1 : 0;
        }

        return answer;
    }
}

(나는 String배열) 이분은 처음에 ArrayList에 String을 모두 담아주고, 그것을 clone해서 복사해서 사용했다. 놀랍도록 비슷하다!

그 뒤, contains와 remove를 사용하니까 for문이 한번 줄어들어서 더 빠르고 간결해질 수 있었다!
단, contains 메서드는 String 배열에서는 사용하지 못하기 때문에 이 풀이처럼 ArrayList로 사용해야한다.

profile
I live in Seoul, Korea, Handsome

0개의 댓글