08. 프로그래머스(1단계) - 체육복

성훈·2021년 7월 31일
0

Algorithm

목록 보기
8/61
post-thumbnail

📌 문제의 조건

  1. 총 학생 수, 체육복 없는 사람 배열, 여벌 옷 있는 사람 배열 을 인자로 받음
  2. 체육복 없는 사람은 번호 +1 하거나 -1 한 사람의 체육복만 빌릴 수 있음.

제한사항 🤔

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

📌 풀이

의사 코드 👨‍💻

  1. lost를 초기값 n으로 리듀스한다.
  2. 조건문을 달아서 lost의 각 인자에 +1 또는 -1한 값이 reserve에 있으면
  3. 그냥 reserve에서 해당 숫자를 빼고 acc반환
  4. 없으면 acc 에서 -1

첫 풀이 👨‍💻

function solution(n, lost, reserve) {
    lost = lost.sort((a,b)=>a-b);
    reserve = reserve.sort((a,b)=>a-b);
    
    lost = lost.filter((e)=>{
        if(reserve.includes(e)){
            reserve.splice(reserve.indexOf(e),1);
            return false;
        }
        return true;
    } )
    
    return lost.reduce((acc, cur)=>{
        if(reserve.includes(cur-1)){
            reserve.splice(reserve.indexOf(cur-1),1);
            return acc;
        } else if(reserve.includes(cur+1)){
            reserve.splice(reserve.indexOf(cur+1),1)
            return acc;
        } else {
            return acc - 1
        }
    }, n)
}

📌 리뷰

리턴문 작성은 5분도 안걸린거 같은데 여러 엣지 케이스들을 고려하는 것에서 시간이 좀 끌렸다.
인덱스가 차례대로 온다고 가정하고 인덱스를 사용한거라 정렬을 시켜줬고,

마지막 제한 사항인 여벌 체육복을 가지고 있는 학생이 체육복을 잃어버린 경우를 필터링 해줬다.
포루프 돌리려다가 필터를 쓸 수 있을 것 같아 사용해봤는데 나쁘지 않았던 것 같다.

📌 문제 출처

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges#

profile
어떻게 이걸 풀어낼 수 있을까

0개의 댓글