ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] 체육복
    알고리즘 2024. 2. 28. 09:56

    ❓문제 설명

    • 최대 인원인 n: number, 체육복이 없는 인원의 명단인 lost: number[], 여분을 가지고 있는 명단 reserve: number[]
    • 여분을 가지고 있는 학생은 자기 +-1 인원에게만 체육복을 빌려줄 수 있음
    • 최대로 많이 수업을 들을 수 있는 인원의 수는?

     

    ✅ 문제 해결

    • 먼저 가장 큰 예외 상황을 구별해야 한다. 그렇기에 도난당했는데 여분을 가지고 있는 학생을 제외하고 나머지에 대해서 공통적인 식을 대입을 해보자
    let lost_student = lost.filter(v => !reserve.includes(v)).sort();
    let reserve_student = reserve.filter(v => !lost.includes(v)).sort();
    • 제외한 이후 정렬에 대해서 문제에 정의되어있지 않기에 좀 더 쉽게 해결하기 위해 정렬을 해준다.
    for (let i = 0; i < reserve_student.length; i++) {
        if (lost_student.includes(reserve_student[i] - 1)) {
          lost_student = lost_student.filter(v => v !== reserve_student[i] - 1);
        } else if (lost_student.includes(reserve_student[i] + 1)) {
          lost_student = lost_student.filter(v => v !== reserve_student[i] + 1);
        }
      }
    • 이후 반복문을 통해서 원하고자 하는 값을 추출한다
    return n - lost_student.length;
    • 마지막 결과에 대해 전체에서 참가하지 못하는 학생의 수를 빼준다.

     

    🔥 인상 깊은 남의 풀이

    function solution(n, lost, reserve) {      
        return n - lost.filter(a => {
            const b = reserve.find(r => Math.abs(r-a) <= 1)
            if(!b) return true
            reserve = reserve.filter(r => r !== b)
        }).length
    }

     

     

    ❕느낀점

    • 어떤 예외를 가장 먼저 처리해야할지에 대해서 좀 더 많은 고민이 필요하다 생각하다. 예외처리를 제대로 하지 않아서 좀 헤메었기에 다음부터는 좀 더 집중을 해야할 것 같다
    • 절대값과 find 메서드를 통해서 구하는 풀이가 인상 깊어서 가져왔다. abs에 대해 생각하지 못한게 좀 아쉽고 find 메서드가 찾은 가장 첫번째 수에 대해서 return을 하기에 정렬된 lost라면 작은 수부터 처리를 할 수 있어서 매우 적합하다고 생각이 된다.
    • 쉬운 문제지만 아직 제대로 감을 못잡았나 속도가 잘 안나고 헷갈리는 부분이 많은 것 같다.

     

    댓글

Designed by Tistory.