ㅇ 문제 정리
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() 는 알고리즘 풀면서 정말 많이 쓰는데 이 실수를 다시는 하지 말아야겠다는 교훈을 얻었다.