본문 바로가기

[코플릿/JS] 배열 문제 - 상

[코플릿/JS] 배열 문제 - 상
 
 
 
 
function getAllElementsButNth(arr, n) {
let result = [];

 

for (let i = 0; i < arr.length; i++) {
if (i !== n) {
result.push(arr[i]);
}
}

 

return result;
}

 

 

23번 문제 (세 가지 방법)

function getAllElementsButNth(arr, n) {
  // slice를 이용하는 방법
  // let head = arr.slice(0, n)
  // let tail = arr.slice(n + 1, arr.length)
  // return head.concat(tail)


  // 반복문을 이용하는 방법
  // let result = [];
  // for (let i = 0; i < arr.length; i++) {
  //   if (i !== n) {
  //     result.push(arr[i])
  //   }
  // }
  // return result;

  // splice를 사용하는 방법
  // arr.splice(n, 1)
  // return arr;
}

 

 

 

 

 

 

function createPhoneNumber(arr) {
let head = '(010)';
const len = arr.length;
const body = arr.slice(len - 8, len - 4).join('');
const tail = arr.slice(len - 4, len).join('');

if (len === 11) {
head = `(${arr.slice(0, 3).join('')})`;
}

return `${head}${body}-${tail}`;
}
 
 
 
 
 
 
 
 
 
리팩토링 전
function createPhoneNumber(arr) {
  // 입력 : [0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8]
  // 출력 : '(010)1234-5678'
    // "(0번째 요소 ~ 2번째요소)" + "3번째 요소 ~ 6번째 요소" + "-" + "7번째 요소 ~ 10번째 요소"
  // `${(arr[0]~arr[2]}${arr[3]~arr[6]}-${arr[7]~arr[11]}`
  // first, second, third라는 변수를 선언하고, 각각 할당한다.
  // slice()메서드로 배열의 일부를 복사 한 후 join()메서드로 문자열로 변경한다.
  let first = arr.slice(0, 3).join('');
  let second = arr.slice(3, 7).join('');
  let third = arr.slice(7).join('');

  // 2. 주어진 배열의 길이가 8인 경우
  if (arr.length === 8) {
    first = '010';
    second = arr.slice(0, 4).join('');
    third = arr.slice(4).join('');
  }

  // 1. 템플릿 리터럴에 각각의 변수를 넣어 리턴한다. -> 길이가 8인 경우를 위해 분기 필요
  return `(${first})${second}-${third}`;
}

리팩토링 후 

// 리팩토링
function createPhoneNumber(arr) {
  // 길이가 11일 때와 8일 때 second와 third를 각각 재할당해야 하는 이유는
  // slice() 메서드를 사용할 때 앞에서부터 복사했기 때문이다.
  // arr.length를 기준으로 뒤에서 부터 복사하기
  let first = arr.slice(0, 3).join('');
  let second = arr.slice(arr.length - 8, arr.length - 4).join('');
  let third = arr.slice(arr.length - 4).join('');

  // 2. 주어진 배열의 길이가 8인 경우
  if (arr.length === 8) {
    first = '010';
    // 이 경우 second와 third의 재할당이 필요 없다.
  }

  return `(${first})${second}-${third}`;
  // 추가 리팩토링: 가독성을 떨어 뜨리는 반복적으로 사용되는 코드를 하나의 변수에 할당할 수 있다.
}
 

 

 

 

 

function fibonacci(num) {
let fibNum = [];

for (let i = 0; i <= num; i++) {
if (i === 0) {
fibNum.push(0);
} else if (i === 1) {
fibNum.push(1);
} else {
fibNum.push(fibNum[i - 2] + fibNum[i - 1]);
}
}

return fibNum;
}

 

 

 

 

 

 

 

 

 

 

function fibonacci(num) {
  // 피보나치를 한 마디로?
  // 다음 수 = 맨 끝에 있는 수 + 그 앞에 있는 수
  // 1. 피보나치 수열을 넣어줄 배열을 만든다.
  let fib = [];
  // 2. 반복문을 돌린다. -> 0부터 num까지 반복
    // 0과 1은 피보나치수열의 기본세팅
    // i가 0일 때, 1일 때는 바로 배열에 push한다.
  for (let i = 0; i <= num; i++) {
    if (i === 0 || i === 1) {
      fib.push(i) // [0, 1]
    } else {
      // 3. 다음 수 = 맨 끝에 있는 수 + 그 앞에 있는 수
      // 반복문의 현재 시점: i = 2, fib = [0, 1]
      // 2번째 요소를 구하기 위해 1번째 요소와 0번째 요소를 더한다. -> fib[2] = fib[1] + fib[0]
      // 다음 반복
      // i = 3, fib = [0, 1, 1]..
      // fib[3] = fib[2] + fib[1]...
      // 그 다음 반복...
      // i = 4, fib = [0, 1, 1, 2]..
      // fib[4] = fib[3] + fib[2]...
      // 이 과정을 i를 이용하여 표현해 보자.
      // fib[i] = fib[i - 1] + fib[i - 2] -> 이렇게 해도 답이 나온다.
      fib.push(fib[i - 2] + fib[i - 1]);
    }
  }
  // 4. 반복이 끝난 후 fib를 리턴
  return fib;
}
728x90
⬆︎