IT/코딩테스트

체육복[프로그래머스]

KeepGooing 2021. 1. 24. 23:14
반응형

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

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

 

 

핵심 1. 여벌을 갖고 있는 학생이 도난 당할 수 도 있다.(1개) 

lost [2, 3, 4]  /  reserve [5, 3, 1]    -> 여벌이 있지만 도난 당한 학생의 번호 : 3번

따라서 도난당한 사람은 진짜 여벌이 없어서 빌리지 못하면 수업에 참여할 수 없는 사람으로

여복이 있는 사람은 도난 당하지 않아서 진짜로 빌려 줄 수 있는 사람으로 다시 분류해야 한다.

 

이를 다음 코드로 구현 할 수 있다.

let borrowAble = reserve.filter(r => !lost.includes(r));
const realLost = lost.filter(r => !reserve.includes(r));

 

핵심 2. 앞번호와 뒷번호의 학생의 체육복만 빌릴 수 있다.

이는 각각 번호의 차이가 1 이상 나면 안된다는 것이다 즉 절대 값 1 보다 크면 빌려줄 수 없다.

 

이름 다음과 같은 구현 할 수 있다.

Math.abs(realLost[index] - borrowAble[index] == 1)

 

핵심 사항은 다 구현하였고 마지막으로

절차에 맞게 구현하면 된다.

여기서 주의할 것은 

이미 빌려준 학생은 다음 빌리려는 학생과 매칭되어서는 안된다는 것이다.

이를 위해서 filter 메서드를 활용하여 조건에 맞는 배열요소만 추출해야 한다.

여기서 조건은 역발상으로 빌리지 못한 학생들의 원소 값만 추출하여 

전체 참여학생에서 빌리지 못해 참여할 수 없는 학생을 제외하여 최종적으로 참여할 수 있는

인원을 구하는 방식으로 진행한다.

 

const temp = realLost.filter( 1 => { 
	const f = borrowAble.find( r => Math.abs(r-l) == 1)
    	if(!f) return true
        	borrowAble = borrowAble.filter(r =>  r !== f)
            });

 

 

 

 

최종으로 코드를 구현하면 다음과 같다.

function solution(n, lost, reserve) {
    let borrowAble = reserve.filter(r => !lost.includes(r));
    const realLost = lost.filter(r => !reserve.includes(r));

       const temp = realLost.filter(l => {
        const f = borrowAble.find(r => Math.abs(r-l) == 1)
        if(!f) return true
        borrowAble = borrowAble.filter(r => r !== f)
    });
    
 return n - temp.length
}

 

 

위의 코드는 프로그래머스의 다른 사람들의 해답을 참고하여 재 코드화 한 것입니다.

제가 구현한 것은 5 % 미만이고요.

다만 문제 설명과 같이 재구현하였습니다.

제 말의 골자는 이들의 사고와 노력에 경의를 보내며 그분들께 좋은 코드를 볼 수 있게 해주셔서 감사한 마음 갖고

포스팅합니다.

반응형