[Programmers] Lv.2 할인 행사 (python, js)

j-ij-i·2022년 12월 13일
1

알고리즘 문제풀이

목록 보기
6/10

문제 링크

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;
}
profile
안녕하세요, 프론트엔드를 좋아하는 개발자 jiji입니다.

0개의 댓글