본문 바로가기

알고리즘 문제 풀이

프로그래머스 [LEVEL 1] - 체육복

https://programmers.co.kr/learn/courses/30/lessons/42862?language=javascript 

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

문제 풀이는 JS와  파이썬으로 하였습니다 

 

사실 예전에  이미 한번 풀었던 문제인데  그 당시에  굉장히 어려워했던 기억이 난다  다시 푸는 지금 생각보다 굉장히 쉬운 문제였고  그때보다  좀 더 효율적인 풀이도 생각하게 된거 같다 

 

 

 

 

 

function solution(n, lost, reserve) {
    
    const realReserve = reserve.filter((el) => lost.indexOf(el) === -1)
    const realLost = lost.filter((el) => reserve.indexOf(el) === -1)
    
    for (let check of realReserve) {
        if (realLost.includes(check - 1)) {
            realLost.splice(realLost.indexOf(check - 1), 1)
           } else if (realLost.includes(check + 1)) {
            realLost.splice(realLost.indexOf(check + 1), 1)
        }
    }
    
    return n - realLost.length;
}

 

 

문제를 푼 방식은   결국은  최종적으로  전체 학생 중  정말로  마지막까지  여벌 옷마저  구하지 못한  학생의 숫자를 구하는 거다  그냥 보면  그럼 막연하게  전체 학생에서  잃어버린 학생 수를 빼면 되는게 아닌가 라고 생각 할 수도 있지만 그게 아니다  제한 사항을 보면   여벌 체육복을 가져온 학생과  체육복을 도난 당한  학생이 중복되는 경우도 있다고 명시 되어 있다  따라서  가장 먼저는  그 중복된 조건을  제거 해줘야 한다 

 

const realReserve = reserve.filter((el) => lost.indexOf(el) === -1)
const realLost = lost.filter((el) => reserve.indexOf(el) === -1)

 

그 다음은   여벌 옷을 가지고 온 사람이  도난 당한 사람의  옷을 빌려주는 경우를 구하는거다 

 

for (let check of realReserve) {
        if (realLost.includes(check - 1)) {
            realLost.splice(realLost.indexOf(check - 1), 1)
           } else if (realLost.includes(check + 1)) {
            realLost.splice(realLost.indexOf(check + 1), 1)
        }
    }
    

 

이제  정말로  옷을 구하지 못한 사람의 숫자를 전체에서 빼주면 해답이 나온다  

 

같은 방식으로 구현한  파이썬 코드다 

 

def solution(n, lost, reserve):
    reallost = set(lost) - set(reserve)
    realreserve = set(reserve) - set(lost)
    
    for i in realreserve :
        if i - 1 in reallost :
            reallost.remove(i - 1)
        elif i + 1 in reallost :
            reallost.remove(i + 1)
            
    return n - len(reallost)