알고리즘 - 조건적 빌리기

wonkeunC·2022년 6월 11일

문제 설명

일부 학생이 수업 시간에 필기구를 가져오지 않았습니다. 다행히 여벌 필기구가 있는 학생이 이들에게 필기구를 빌려주려 합니다. 학생들의 번호는 자리 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 필기구를 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 필기구를 빌려줄 수 있습니다. 필기구가 없으면 수업을 들을 수 없기 때문에 필기구를 빌려 최대한 많은 학생이 수업을 들어야 합니다.

전체 학생의 수 n, 필기구를 가져오지 않은 학생들의 번호가 담긴 배열 no_pencil, 여유의 필기구를 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

n	 no_pencil	    reserve	   return(count)
5	  [2, 4]	   [1, 3, 5]	 5   
5	  [2, 4]	      [3] 	     4
3	  [3] [1]         [1]        2

구현해야 할 순서 정리하기

  • 필기구가 없는 학생 : no_pencil
  • 필기구 여유가 있는 학생 : reserve

예외 처리하기

n	 no_pencil	      reserve	   return(count)
5   [2,3, 4]    [1,3, 5]	      5   
  1. 필기구를 가져오지 않은 학생과, 가져온 학생의 값이 같다면 그 값은 수업을 들을 수 있는 조건이므로 해당 값을 reserve에서 제거하고 count + 1 해준다. no_pencil[i] === reserve[i] = i 제거
  1. 따라서 reserve 배열에서 제거 후 count + 1 해주고.
  1. 중복 값이 없다면 나머지 no_pencil 원소들을 새로운 배열 no_pencil_list에 담아둔다.
const count = n - pencil.length; 
// 전체 학생 수에서 없는 애들 먼저 빼고 차근차근 빌릴 수 있는 학생을 찾아서 count + 1 진행.

const no_pencil_list = [];

for(let i = 0; i < no_pencil.length; i++ ) {
  if(reserve.includes(no_pencil[i])){  // reserve에 no_pencil과 같은 값이 포함되어 있다면.
  reserve = reserve.filter((el) => el !== no_pencil[i]); 
// reserve에서 no_pencil[i]와 같은 값을 제거한다. [1,3,5]
// filter : 조건이 맞지 않은 값을 배열에서 제거한다.  reserve = [1,5]
    count++; // 수업 참여 가능
  }else {
    // no_pencil[i]의 값이 reserve 배열 원소중에 존재함으로 그 값만 if문에서 걸러주고 나머지 값.
  no_pencil_list.push(no_pencil[i]); // [2, 4]
  }
}
no_pencil = no_pencil_list;

4번 학생은 3번 학생이나 5번 학생에게만 필기구를 빌려줄 수 있습니다.

n	 no_pencil	    reserve	   return(count)
5	  [2, 4]	    [1, 5]	       5   
  1. no_pencil 원소 기준으로 왼쪽 값이 reserve 배열 원소 중에 있는지 왼쪽 탐색.
for(let i = 0; i < no_pencil.length; i++){ 
 if(reserve.includes(no_pencil[i] - 1)){  // no_pencil[i] 값에서 - 1 한 값이 reserve배열 안에 있는지.
 reserve = reserve.filter((el) => el !== pencil[i] - 1); // 있다면 빌려줄 수 있다는 의미로 그 값은 제외시키고 .
   count++; // 빌려준 학생 카운터 + 1 한다.
 }
}
  1. no_pencil 원소 기준으로 오른쪽 값이 reserve 배열 원소 중에 있는지 오른쪽 탐색.
for(let i = 0; i < no_pencil.length; i++) {
 if(reserve.includes(no_pencil[i] + 1)){ // no_pencil[i] 값에서 + 1 한 값이 reserve배열 안에 있는지.
  reserve = reserve.filter((el) => el !== pencil[i] + 1); // 있다면 빌려줄 수 있다는 의미로 그 값은 제외시키고 .
   count++; // 빌려준 학생 카운터 + 1 한다.
 }
}
profile
개발자로 일어서는 일기

0개의 댓글