2차 공부/알고리즘

할인 행사

공대탈출 2024. 7. 23. 21:19

function solution(want, number, discount) {
    var answer = 0;
    let wantMap = new Map()
    for(let i = 0; i<want.length; i++) {
        wantMap.set(want[i], number[i])
    }
    let tempMap = new Map(wantMap.entries())
    let flag = false
    for (let j = 0; j<discount.length; j++) {
        if (tempMap.has(discount[j])) {
            tempMap.set(discount[j], tempMap.get(discount[j])-1)
            flag = true
        }
        if (!(tempMap.has(discount[j]))&&(flag && j !== 0)) {
            tempMap = new Map(wantMap.entries())
            flag = false
            continue
        }
    }
    tempMap.forEach((value, idx, array) => {
        if (value<0) answer-=value
    })
    return answer;
}

코드를 작성하고 문제를 다시 읽어보니 당연히 틀린것이라고 생각이 들었다.

그 이유는 연속적으로 원하는 물건이 들어오는지는 확인을 하지만, 해당 연속에서 원하는 물건의 개수가 맞춰질수있는지에 대한 예외처리가 없기때문이다.

또한, 알맞은 순서와 알맞은 순서 사이 틀린 값이 들어올 때도 고려하여 모든 discount배열을 돌아야 하는데 해당 부분도 부족한 것 같다.

 

function solution(want, number, discount) {
    var answer = 0;
    for (let i = 0; i<discount.length-9; i++) {
        let sliced = discount.slice(i, i+10);
        let flag = true;
        
        for (let j =0; j<want.length; j++) {
            //만약 want의 j번째 해당하는 제품과 잘린 배열의 제품개수가 다르다면
            if (sliced.filter((el) => el === want[j]).length !== number[j]) {
                //flag를 false로 하고 반복을 벗어난다.
                flag = false;
                break;
            }
        }
        //만약 want배열의 제품이 number배열의 양만큼 각각 sliced배열에 들어있다면,
        //경우의수에 1을 더한다.
        if (flag) answer++          
    }
    return answer;
}

discount 배열을 10단위로 가능한 모든 경우를 잘라내어 잘라진 배열에 원하는 제품이 모두 개수가 맞게 들어있다면

count에 1을 더하고, 모든 잘라진 배열을 탐색하는 방식이다.

솔직히 맘에 들진 않는다. JSON.stringify를 써볼까 했는데, 순서가 문제일수도 있어 사용하지 못했다.

'2차 공부 > 알고리즘' 카테고리의 다른 글

앞으로의 알고리즘은 깃허브로  (0) 2024.07.24
의상  (0) 2024.07.24
n^2 배열 자르기  (0) 2024.07.19
괄호 회전하기  (0) 2024.07.17
이진 변환 반복하기  (0) 2024.07.09