문제 링크
link 📃
문제 풀이
- 처음에 총 몇일이 가입 가능한 날짜인지 구하는 것이 아니라 가장 빨리 가입을 했을 떄 언제인지를 구해서 답이 빨리 도출되지 못했다..🥲
- want 배열과 number 배열을 lists 라는 딕셔너리 (js에서는 객체)로 만들었다. 각각 want 배열은 key값, 그에 대응하는 number 배열은 value로 넣었다.
- discount 배열을 처음부터 돌면서 10의 범위만큼 lists 딕셔너리 값을 모두 제거할 수 있으면 answer값을 1 증가시켜 최종적으로 answer 값을 return 해주게 풀었다.
다른풀이 탐색
- discount가 어짜피 무조건 10의 범위이기 때문에 [i:i+10]으로 간단하게 해주었다.
- python의 Counter을 써서 해당 배열이 몇개의 key, value를 갖는지 바로 파악해주는 방법이 있었다.
나의 해결 코드
Python
def solution(want, number, discount):
answer = 0
target = 0
total_cnt = sum(number)
lists = dict()
for i in range(len(number)):
lists[want[i]] = number[i]
copy_lists = lists.copy()
while target < len(discount):
for i in range(target, target+total_cnt):
if i >= len(discount):
target = len(discount)
break
elif discount[i] not in want:
target = i + 1
break
elif discount[i] in want:
if copy_lists[discount[i]] <= 0:
copy_lists = lists.copy()
target += 1
break
else:
copy_lists[discount[i]] -= 1
print(copy_lists[discount[i]])
else:
answer += 1
target += 1
copy_lists = lists.copy()
return answer
javascript
function solution(want, number, discount) {
let answer = 0;
let target = 0;
let total_cnt = number.reduce((a,b) => a+b, 0);
const lists = {};
for(let i = 0 ; i < number.length ; i++){
lists[want[i]] = number[i];
}
let copy_lists = Object.assign({}, lists);
while(target < discount.length){
Flag = true
for(let i = target ; i < target + total_cnt ; i++){
if(i >= discount.length){
target = discount.length;
Flag = false
break
}else if(!(Object.keys(copy_lists).includes(discount[i]))){
target = i + 1
Flag = false
break
}else if(Object.keys(copy_lists).includes(discount[i])){
if(copy_lists[discount[i]] <= 0){
copy_lists = Object.assign({},lists)
target += 1
Flag = false
break
}else{
copy_lists[discount[i]] -= 1
}
}
}
if(Flag){
answer += 1
target += 1
}
copy_lists = Object.assign({},lists)
}
return answer;
}