Programming

[알고리즘] 프로그래머스 체육복

jay-dev 2023. 6. 26. 19:16

프로그래머스 문제 링크

My Solution / Try

  • 학생수 길이의 배열을 만들고 전부 1로 채움 (Array,fill 활용)
  • 잃어버린 학생의 배열의 요소는 0으로 재할당
  • 여벌을 가지고 있는 학생의 배열의 요소는 +1
  • 반복문을 돌며 잃어버린 학생(i)의 앞번호 학생(i-1)이 여벌을 가지고 있다면
    해당 학생에게 빌려주고(arr[i] = 1) 앞번호 학생의 체육복 개수는 다시 1개로(arr[i-1] = 1)
    앞번호 학생이 여벌을 가지고 있다면
    arr[i] = 1 / arr[i+1] = 1
function solution(n, lost, reserve) {    
    
    let arr = Array(n).fill(1);    
   
    lost.map((e) => arr[e-1] = 0);  
    
    reserve.map(e => arr[e-1] += 1);

    for(let i=0; i<n; i++){        
        if(arr[i] === 0 && arr[i-1] ===2){
            arr[i] = 1;
            arr[i-1] = 1;
        }        
        else if(arr[i] === 0 && arr[i+1] === 2){
            arr[i] = 1;
            arr[i+1]=1;
        }
    }
    
    return arr.filter(e => e > 0).length;
}

Another Solution

  • 체육복을 도난 당하고 여벌도 없는 학생(lost_student)
  • 체육복을 도난 당했지만 여벌이 있는 학생 / 체육복을 도난 당하지 않고 여벌도 있는 학생(reverse_student) 구분 필요
function solution(n, lost, reserve) {
  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;
}