체육복
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
function removeDuplicate(origin, other){ const setOrigin = new Set(origin); other.forEach(o => setOrigin.has(o)&& setOrigin.delete(o)); return [...setOrigin]; } function solution(n, lost, reserve) { const lostStudent = removeDuplicate(lost, reserve); const reserveStudent = removeDuplicate(reserve, lost); for(let i of reserveStudent){ let key = lostStudent.includes(i-1) ? lostStudent.indexOf(i-1) : lostStudent.indexOf(i+1); if (key != -1){ lostStudent.splice(key,1); } } return n-lostStudent.length }
풀이
- 중복을 제거하는 함수를 만든다(여벌 체육복을 가져온 학생이 체육복을 도난당했을 경우).
- 앞뒤로 체육복을 줄 수 있다면 indexOf로 위치 번호를 받는다.
- 체육복을 받은 학생을 제거한다.
- indexOf는 지정된 요소의 인덱스를 찾을 수 있음.
- Set 객체를 사용하여 배열의 중복된 요소를 제거할 수 있음.
사용된 속성
- indexOf() - 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환함.
const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); // expected output: 1
타겟 넘버
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
function solution(numbers, target) { let count = 0; function dfs(depth, sum) { if(depth === numbers.length){ if(sum === target){ count++; } return; } dfs(depth+1, sum + numbers[depth]); dfs(depth+1, sum - numbers[depth]); } dfs(0, 0); return count; }
풀이
- depth와 sum을 더하는 재귀함수를 호출한다.
- 이 재귀함수에 조건을 설정해서 조건에 충족한다면 재귀함수를 탈출한다.
재귀 함수를 호출하는 동안에 콜 스택에 저장된다는 사실을 기억하자.
큰 수 만들기
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
function solution(number, k) { const N = number.length - k; const st = []; let i = 0; while(i<number.length) { const leftChance = number.length - i; if(st.length === 0 || st.length + leftChance <=N) { st.push(number[i]); i++; continue; } const top = st[st.length-1]; if(number[i] > top) { st.pop(); continue; } st.push(number[i]); i++; } return st.slice(0,N).join(""); }
풀이
- 배열의 가장 첫 수를 스택에 저장한다.
- 첫 수와 다음수를 비교하여 다음수가 크다면 기존 숫자를 제거한다.
- 크지 않을 경우 number[i]에 있는 값을 스택에 저장한다.
- leftChance가 부족해지면 나머지 숫자를 스택에 저장한다.
- N번째까지 스택을 잘라 반환한다.
- 스택을 이용할 줄 알아야 함.
- 큰 수를 만났을 때 pop만 하고 i를 더해주지 않아야 새로 들어온 값을 다시 비교할 수 있음.
- continue는 반복문을 이어가는 것임.