본문 바로가기

알고리즘

프로그래머스 체육복 javascript와 python의 비교

728x90

 

 

문제가 이렇게 나왔다

우습게도 이것도 예전에 풀었던 문제였다.

 

function solution(n, lost, reserve) {
    var arr = [];   //빌려줄 수 있으면 true, 아니면 false

    for(let i=1;i<=n;i++){
        arr.push(1) //체육복 1개줌
        if(reserve.includes(i)){ //체육복 2개가져왔으면 1개 추가해줌
            arr[i-1]++;
        }
        if(lost.includes(i)){ //체육복 없으면 1개 깜
            arr[i-1]--;
        }
    }
    for(let i=0;i<n;i++){
        if(arr[i] == 0){
            if(arr[i-1]==2){
                arr[i-1]--
                arr[i]++;
            }
            else if(arr[i+1]==2){
                arr[i+1]--;
                arr[i]++;
            }
        }
    }

    let cnt=0;
    for(let i=0;i<n;i++){
        if(arr[i]>0){
            cnt++;
        }
    }

    return cnt;
}

 

 

일단 기본적인 방식은 전체 학생의 수만큼 반복하면서 각 배열의 값에 따라 정답 배열의 값을 더하거나 빼는 것이다.

 

def solution(n, lost, reserve):
    u = [1]*(n+2)

    for i in reserve:
        u[i]+=1
    for i in lost:
        u[i]-=1

    for i in range(1,n+1):
        if(u[i-1] == 0 and u[i]==2):
            u[i-1:i+1] = [1,1]
        elif u[i] == 2 and u[i+1] == 0 :
            u[i:i+2] = [1,1]

    print([x for x in u[1:-1] if x>0])
    
    return len([x for x in u[1:-1] if x>0])

기본적인 로직은 동일하나, 슬라이싱을 이용하여 조금 더 코드가 간결해졌다.

 

def solution(n, lost, reserve):
    for i in reserve :
        if i in lost :
            reserve.remove(i)
            lost.remove(i)
    for i in sorted(reserve) :
        if i-1 in lost or i+1 in lost :
            try:
                lost.remove(i-1)
            except:
                lost.remove(i+1)

처음에 푼 코드이다.

이것도 정상적으로 문제는 풀리지만

list에 대한 remove의 수행시간이 O(n)만큼 걸리기 때문에 비효율적이라 위의 코드로 변경했다.

728x90