체육복

lim1313·2021년 8월 1일
0

프로그래머스

문제 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.


내 풀이 1차

function solution(n, lost, reserve) {
  let reserveCan = reserve.filter((a) => !lost.includes(a))

  for (let i = 0; i < lost.length; i++) {
    if(reserveCan.includes(lost[i] - 1) || reserveCan.includes(lost[i] + 1)){
      n++
      reserveCan.splice(reserveCan.indexOf(lost[i]-1),1)
    }
  }
  return n - lost.length
}
수도코드
  1. reserve에서 lost 번호가 겹치지 않는 번호만 체육복을 빌려줄 수 있다.
  2. 그 중 체육복은 앞, 뒤 1 씩 큰 숫자에만 빌려줄 수 있다.
  3. reserve에서 체육복은 한번만 빌려줄 수 있다. -> splice를 통해 배열 요소 삭제
놓친 2가지
  1. lost와 reserve의 중복되는 값을 제거하기 위해 filter를 사용하여, reserve에서 lost와 동일한 번호를 삭제한 배열을 반환하였다. 하지만, lost에서 또한 reserve와 중복되는 번호를 제거해 주었어야 했다. 이를 발견하는데만 30분은 걸린 듯 하다.
    수도 코드를 작성할 때, 주어진 조건에 다양한 변수들을 세분화하여 고민하고 작성하는 것이 필요한 것 같다.

  2. if문을 통해 수도코드 2번을 실현하는 과정에서 || 연산자를 활용하였는데, 각각의 조건에 따라 다른 실행이 필요했다. 성급하게 작성한 코드였던 것 같다.

내 풀이 최종

function solution(n, lost, reserve) {
  reserved = reserve.filter((a) => !lost.includes(a))
  losted = lost.filter((a) => !reserve.includes(a))

  reserved.sort((a,b) => a-b)
  losted.sort((a,b) => a-b)

  for (let i = 0; i < losted.length; i++) {
    if(reserved.includes(losted[i] - 1)){
      n++
      reserved.splice(reserved.indexOf(losted[i]-1),1)
    } else if (reserved.includes(losted[i] + 1)){
      n++
      reserved.splice(reserved.indexOf(losted[i]+1),1)

    }
  }

  return n - losted.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
}

와우...하하하...

filter를 통해 요소 제거

나의 풀이에서 체육복을 빌려준 번호를 제거하기 위해 splice를 사용하였고, 그 과정에서 indexOf를 통해 제거해줄 인자를 구하는 과정을 거쳐야만 했다.

reserved.splice(reserved.indexOf(losted[i]+1),1)

하지만, splice를 굳이 사용하지 않더라도 filter를 통해 조건에 해당하는 요소를 제거해 줄 수 있다.

reserve = reserve.filter(r => r !== b)
profile
start coding

0개의 댓글