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로 사용해야한다.