Lsiron

코딩테스트 5(filter, Math.min, substr, Math.floor, repeat, slice) 본문

코딩테스트/Java Script

코딩테스트 5(filter, Math.min, substr, Math.floor, repeat, slice)

Lsiron 2024. 5. 25. 14:28

문제 1. 제일 작은 수 제거하기

 

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다

 

풀이=해답.

function solution(arr) {
  return arr.length === 1 ? [-1] : arr.filter((num) => num !== Math.min(...arr))
}

 

=> 삼항연산자를 사용하였다. 리턴하려는 값이 빈 배열일 경우거나, arr 배열이 [10] 일 경우는 모두 length가 1인 경우이기 때문에 arr.length가 1이면 [-1]을 반환하도록 하였고, length가 1이 아니라면, 최솟값을 구하는 함수 Math.min(...arr)을 사용하여 filter() 함수를 통해 최솟값을 뺀 배열을 반환하도록 하였다.

 

// 처음으로 코테에서 고득점을 받았다. 한 줄로 써보는 연습을 해봤는데 이게 잘 먹힌것 같다. 또한 Math.min()으로 최솟값을 구할때 사용법을 제대로 알고나서 풀었던게 도움이 됐다. 아니였으면 반복문을 사용했을 것이다.

 

문제 2. 콜라츠 추측

 

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

 

풀이 = 해답.

function solution(num) {
  let count = 0;

while (num !== 1) {
  if (num % 2 === 0) {
      num = num / 2;
  } else {
      num = num * 3 + 1;
  }

  count++;

  if (count === 500) {
      return -1;
  }
}

return count;
}

 

=>  while 반복문을 사용하였다. for 반복문을 사용하기에는, count 횟수를 구할 방법이 없었다. 때문에 먼저 count 변수를 선언 한 후, num 이 1이 아니라는 조건을 걸고 조건문으로 짝수와 홀수 일 경우를 넣어주었다. 이 후, count가 500이 될 경우 -1 을 반환하는 형태로 500이 안될 경우 count를 반환하는 형태로 코드를 짜주었다.

 

// for문으로 해보려고 생각하다가 시간이 너무 오래걸렸다. 반복문을 사용해야하는 상황이 오면 while인지 for인지 빠르게 판단하는게 중요할 것 같다.

 

문제 3. 가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

풀이 = 해답.

function solution(s) {
  if(s.length % 2 === 0) {
      return s.substr(Math.floor(s.length / 2) - 1, 2)
  } else {
      return s.substr(Math.floor(s.length / 2), 1)
  }
}
}

 

=> 문자열에도 length를 적용할 수 있기 때문에, length에 중점을 두고 풀었다. 또한 Math.floor를 사용하여, 추출할 자리를 구했다.

 

// 지금 생각해보면 Math.floor로 소숫점을 지워주는것을 몰랐다면 아마 소숫점 단위로 빼줬을 듯 하다. 예를 들어 length가 2로 나누어 떨어지는 경우는 그대로 -1 (어차피 s.length가 정수이기 때문에) 2로 나누어 떨어지지 않는 경우에는 s.length -0.5

 

문제 4. 수박수박수박수박수?

 

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

 

풀이. 

function solution(n) {
  let even = "수박"
  let odd = "박수"
  return n === 1 ? "수" : n % 2 === 0 ? even.repeat(n/2) : "수" + odd.repeat(Math.floor(n/2))
}

 

해답.

function solution(n) {
  return "수박".repeat(n).slice(0,n);
}

 

=> 짝수일 경우는 "수박" 홀수일 경우는 "박수" 로 패턴을 파악한 뒤, 삼항연산자를 사용하여, n이 1일 경우를 제외하곤 repeat를 사용하여 짝수 홀수 별로 n/2 값을 곱하도록 하였다.

 

// repeat와 slice를 알고 있음에도 저렇게 간단한 해답까진 도달하지 못 했다. 내장함수에 익숙하지 않은 결과라고 볼 수 있겠다. 생각을 복잡하게 시작하는 습관을 고치도록 해야겠다.

 

하루 총평.

문제를 복잡하게 생각하는 버릇이 생겼다. 내장함수를 잘 이용하면 간단히 풀리는 문제이나, 여러번 반복문과 조건문으로 푸는 문제를 마주치다 보니 반복문과 조건문 먼저 생각하게 되었다. 문제를 해석하는 시간은 상대적으로 줄었으나, 푸는 방법을 복잡하게 생각하게 되어 시간이 너무 많이 흘러버린다. 내장함수를 최대한 활용하는 방식으로 접근해야겠다.