문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/131127
접근 방법
map에 key, value로 제품과 수량을 저장하고
1일~10일동안 할인해서 구매할 수 있는 제품을 살펴보고
구매할 수 있는 제품이 있다면 value-1 해준다.
그 후, 1일에 구매했던 제품은 구매 안한걸로 처리해주고 11일에 구매할 수 있으면 구매해준 걸로 처리한다.
이 과정을 마지막 날이 될 때까지 반복해주면서, 가능한 날이 있으면 answer++ 해주면 끝!
코드 설명
function solution(want, number, discount) {
var answer = 0;
let map = new Map();
//map에 key:원하는 제품, value: 수량 저장
for (let i = 0; i < want.length; i++) {
map.set(want[i], number[i]);
}
//1일~10일
//할인하는 제품이 있으면 map에서 가져와서 value-1 시켜줌
for (let i = 0; i < 10; i++) {
if (map.has(discount[i])) {
map.set(discount[i], map.get(discount[i]) - 1);
}
}
//endDay = 마지막 날 저장(10일 -> 인덱스이므로 9 저장)
let endDay = 9;
for (let i = 0; endDay < discount.length; i++) {
let flag = true;
//map의 모든 value를 검사 -> 0보다 큰 값이 존재하면 가능한 날 아님
for (let value of map.values()) {
if (value > 0) {
flag = false;
break;
}
}
if (flag) answer++; // 모든 value가 0 이하이므로 가능한 날임
if (map.has(discount[i])) { //첫째날 제외(map의 value+1)
map.set(discount[i], map.get(discount[i]) + 1);
}
endDay++; //마지막 날 + 1
if (map.has(discount[endDay])) { //마지막 날에 할인하는 상품이 존재하면 value-1
map.set(discount[endDay], map.get(discount[endDay]) - 1);
}
}
return answer;
}
map에 key=want 배열의 값: value=number 배열의 값 저장해준다.
정리하자면 key 값이 원하는 제품, value 값이 원하는 제품의 수량을 의미한다.
문제에서 회원 자격을 10일로 고정했고, number 배열 원소의 총합도 10으로 고정되어 있다.
처음엔 10일 고정인지 몰라서 number 배열 총합 구하고 그랬는데 문제 다시 읽어보니까 고정되어 있었다.
이래서 문제를 잘 읽어야 돼 ㅎ.ㅎ
10일로 고정되어있으니까 먼저 1일~10일까지 할인하는 제품을 살펴보며 원하는 제품을 구매한다.
1일~10일은 인덱스로 나타내면 discount[0]~discount[9]가 되고,
map에 discount[i]의 값이 있다면 map에서 꺼내와서 -1 해준다.(구매한다라고 생각하면 쉬울지도?)
endDay에 마지막 날의 인덱스를 저장해준다.
flag는 map의 모든 value 값이 0 이하인지의 여부를 확인하기 위한 변수이다.
value 값이 0 이하라면 원하는 제품을 모두 구매한 것으로 보면 된다.
map의 value 값들을 검사한 후에는
첫 째날에 구매했던 제품들을 제외시켜주고, 마지막 날에 구매할 수 있는 제품이 있는지 확인해주면 된다.
우여곡절 끝에 성공!
처음에 떠올렸던 접근 방법이 맞았긴 했지만 코드를 풀면서 많이 헤맸다.
분명 접근방법은 맞는거 같은데 테스트 12만 통과하고 다 실패가 뜨길래
주어진 테스트 케이스 가지고 손으로 적으면서 풀어보니까 코드를 잘못 작성했던 부분을 찾았다.
한 번에 뚞딲 풀 수 있는 날이 오길 바라며 ...
'Algorithm' 카테고리의 다른 글
[Programmers]게임 맵 최단거리/JS (1) | 2024.01.23 |
---|---|
[Programmers]구명보트/JS (2) | 2024.01.22 |
[Programmers]하노이의 탑(12946번)/JS (1) | 2024.01.21 |
[Programmers]기능개발(42586번)/JS (1) | 2024.01.15 |
[Programmers]n^2 배열 자르기(87390번)/JS (1) | 2024.01.11 |