N개의 최소공배수 (Level 3)

문제

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다.

예를 들어 2와 7의 최소공배수는 14가 됩니다.

정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다.

nlcm 함수를 통해 n개의 숫자가 입력되었을 때, 최소공배수를 반환해 주세요.

예를들어 [2,6,8,14] 가 입력된다면 168을 반환해 주면 됩니다.

풀이

function nlcm(num) {
    let res = [num[0]];
  for ( let i = 1; i < num.length; i++ ) {
    let max = 1;
    for ( let j = 2; j <= Math.min(res[i-1], num[i]); j++ ) {
          if (( res[i-1] % j == 0 ) && ( num[i] % j == 0 )) {
        if ( max < j ) { max = j } 
        }
    }
    res[i] = res[i-1]*num[i]/max
  }
  return res[res.length-1]
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(nlcm([2,6,8,14]));

꽤 오래 걸린 것 같음.. 생각하고서 쓰질않고 쓰고나서 생각해버리니까 아예 방향을 잘못잡아서 고생함.

res라는 배열에 num배열에서 순차적으로 두 수의 최대공배수를 계산해 삽입.

res[0] = num[0]

res[0],num[1] => res[1]

res[1],num[2] => res[2]

res[num.length-2],num[num.length-1] => 결과

이런식으로 계산을 했다.

썩 마음에 드는 코드는 아닌 것 같다.

다른 사람의 풀이

function nlcm(num) {
  return num.sort((a, b) => a - b).reduce(lcm);
}
function lcm(num1, num2){
  return (num1 * num2) / gcd(num1, num2);
}
function gcd(num1, num2){
  if(num2 == 0) return num1;
  return gcd(num2, num1%num2);
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(nlcm([2,6,8,14]));

이런식으로 풀어보려 했는데, 머리가 너무 복잡해져서 떠올리지 못해버렸다..

으렵다


멀리 뛰기 (Level 3)

문제

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는

(1칸, 1칸, 1칸, 1칸)

(1칸, 2칸, 1칸)

(1칸, 1칸, 2칸)

(2칸, 1칸, 1칸)

(2칸, 2칸)

의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다.

멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 출력하는 jumpCase 함수를 완성하세요.

예를 들어 4가 입력된다면, 5를 반환해 주면 됩니다.

풀이

function jumpCase(num) {
    let arr = [1,2];
  for ( let i = 2; i < num; i++ ) {
    arr.push(arr[i-1]+arr[i-2])
  }
  return arr[arr.length-1]
}

//아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(jumpCase(4));

내용을 잘 보면 피보나치 수열이란걸 알 수 있고, 재귀함수 대신에 반복문으로 풀어봄.

아마 이게더 빠르지 않나 싶은데 확실히는 모르겠당

다른 사람의 풀이

function jumpCase(num) {
    if (num === 1) return 1
  if (num === 2) return 2
  return jumpCase(num-1) + jumpCase(num-2)
}

재귀함수로 푸는 방법!


다음 큰 숫자 (Level 3)

문제

어떤 수 N(1≤N≤1,000,000) 이 주어졌을 때, N의 다음 큰 숫자는 다음과 같습니다.

  • N의 다음 큰 숫자는 N을 2진수로 바꾸었을 때의 1의 개수와 같은 개수로 이루어진 수입니다.
  • 1번째 조건을 만족하는 숫자들 중 N보다 큰 수 중에서 가장 작은 숫자를 찾아야 합니다.

예를 들어, 78을 2진수로 바꾸면 1001110 이며, 78의 다음 큰 숫자는 83으로 2진수는 1010011 입니다.

N이 주어질 때, N의 다음 큰 숫자를 찾는 nextBigNumber 함수를 완성하세요.

풀이

function nextBigNumber(n){
  let result = 0;
    for ( let i = n+1; ; i++) {
      if ( n.toString(2).match(/1/gi).length == i.toString(2) .match(/1/gi).length) {
        return i
    }
  }
}

//아래 코드는 테스트를 위한 코드입니다.
console.log(nextBigNumber(78));

이진법으로 변경후에 1의 개수를 비교해 같은 결과가 나올때까지 반복 후 i 리턴

다른 사람의 풀이

가독성은 다른 코드들이 괜찮지만, 짧은코드가 더 좋아서(고수느낌ㅎ) 안가져왔음


콜라츠 추측 (Level 2)

문제

1937년 Collatz란 사람에 의해 제기된 이 추측은, 입력된 수가 짝수라면 2로 나누고, 홀수라면 3을 곱하고 1을 더한 다음, 결과로 나온 수에 같은 작업을 1이 될 때까지 반복할 경우 모든 수가 1이 된다는 추측입니다.

예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다.

collatz 함수를 만들어 입력된 수가 몇 번 만에 1이 되는지 반환해 주세요.

단, 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

풀이

function collatz(num) {
  let count = 0;
    while ( num > 1 ) {
    if ( count >= 500 ) {
      return -1
    } else {
      if ( num % 2 == 0 ) {
        num = num /2
      } else {
        num = num*3 + 1
      }
      count++
    }
  }
  return count
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( collatz(6) );

그냥 보이는 그대로 코드짠거라 어렵지는 않고 딱히 부연설명도 필요 없는듯 하다.

다른 사람의 풀이

function collatz(num) {
    var answer = 1;
    while((num = doCalc(num)) != 1){
    answer++;
    if(answer == 500) return -1;
  }
    return answer;
}
function doCalc(num){
  return num % 2 == 0 ? num / 2 : (3 * num) + 1;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( collatz(6) );

비슷한데 함수를 두개로 쪼개서 호출하는 방법.

이게 더 괜찮은 듯 하다.


소수 찾기 (Level 2)

문제

numberOfPrime 메소드는 정수 n을 매개변수로 입력받습니다.

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하도록 numberOfPrime 메소드를 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

10을 입력받았다면, 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

5를 입력받았다면, 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

풀이

function numberOfPrime(n) {
  let count = 1;
  if ( n == 2 ) { 
    count = 1;
  } else {
        for ( let i = 3; i <= n; i++ ) {
        let check = false;
          for ( let j = 2; j < i; j++) {
        if ( i % j != 0 ) {
          check = true;
        } else {
          check = false;
          break;
        }
      }
       if (check) { count++ }
    }
    return count;
  }
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( numberOfPrime(10) )

포문 두개로 모든 수에 만족하면 카운트 +1 하는 코드

다른 사람의 풀이

비슷하고 눈에 띄는 방법은 딱히 없는것 같다.

괄호 확인하기 (Level 2)

문제

is_pair함수는 문자열 s를 매개변수로 입력받습니다.

s에 괄호가 알맞게 짝지어져 있으면 True를 아니면 False를 리턴하는 함수를 완성하세요.

예를들어 s가 “(hello)()”면 True이고, “)(“이면 False입니다.

s가 빈 문자열(“”)인 경우는 없습니다.

풀이

function is_pair(s){
  let obj = {"(":0};
  let arr = s.split("");
  for (let i in arr) {
    if ( obj["("] < 0 ) {
      return false
    } else if ( arr[i] == "(") {
        obj["("]++
      }
      else if ( arr[i] == ")") {
          obj["("]--
      } else {
        continue;
      }
    }
    if ( obj["("] == 0 ) { return true }
  else { return false }
  }

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( is_pair(")(") )

코드가 너무 지저분함. 작동을 하긴하는데 별로 맘에들진 않는다.

다른 사람의 풀이

function is_pair(s){
  var arr = s.split('');
  var zero = 0;
  for(var i in arr) {
    if(arr[i] === '(')
      zero += 1;
    else if(arr[i] === ')')
      zero -= 1;
    if(zero < 0)
      return false;
  }
  return zero === 0;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( is_pair("(hello)()") )
console.log( is_pair(")(") )

객체 대신에 그냥 숫자형으로 처리했어도 되는데 괜히 어렵게 생각한듯 하다.

근데 이프문에 중괄호를 안써도되는건가 신기하네


두 정수 사이의 합 (Level 2)

문제

toWeirdCase함수는 문자열 s를 매개변수로 입력받습니다.

문자열 s에 각 단어의 짝수번째 인덱스 문자는 대문자로, 홀수번째 인덱스 문자는 소문자로 바꾼 문자열을 리턴하도록 함수를 완성하세요.

예를 들어 s가 “try hello world”라면 첫 번째 단어는 “TrY”, 두 번째 단어는 “HeLlO”, 세 번째 단어는 “WoRlD”로 바꿔 “TrY HeLlO WoRlD”를 리턴하면 됩니다.

주의 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단합니다.

풀이

function adder(a, b){
  let min = 0, max = 0, sum = 0;
  if ( a < b ) {
      min = a, max = b
  } else {
      min = b, max = a
  }
  for ( let i = min; i <= max; i++ ) {
      sum += i
  }
  return sum
}


// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( adder(3, 5) )

대소비교하는 코드가 너무 마음에 안든다.

자꾸 생각하기전에 손이먼저 나가서 적당한 메소드를 못 떠올린다.

다른 사람의 풀이

function adder(a, b, s = 0){
  for (var i = Math.min(a, b); i <= Math.max(a, b); i++) s += i;
  return s;
}


// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( adder(3, 5) )

Math.min() 아는건데 못생각했다. 문제가 심각함

생각하고 코드적기!

이상한 문자 만들기 (Level 2)

문제

toWeirdCase함수는 문자열 s를 매개변수로 입력받습니다.

문자열 s에 각 단어의 짝수번째 인덱스 문자는 대문자로, 홀수번째 인덱스 문자는 소문자로 바꾼 문자열을 리턴하도록 함수를 완성하세요.

예를 들어 s가 “try hello world”라면 첫 번째 단어는 “TrY”, 두 번째 단어는 “HeLlO”, 세 번째 단어는 “WoRlD”로 바꿔 “TrY HeLlO WoRlD”를 리턴하면 됩니다.

주의 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단합니다.

풀이

function toWeirdCase(s){
  let check = s.split(" "), ans = [],val = null;
  for (let elem of check) {
    val = elem.split("")
    for (let i = 0; i < val.length; i++) {
      if( i % 2 == 0 ) {
        val[i] = val[i].toUpperCase()
      } else {
        val[i] = val[i].toLowerCase()
      }
    }
    ans.push(val.join(''))
  }
  return ans.join(" ")
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + toWeirdCase("try hello world"));

공백을 기준으로 배열로 자르고, 다시 문자열 하나하나 잘라서 인덱스로 홀짝 비교 후 변경 후 조인

다른 사람의 풀이

function toWeirdCase(s){
  //함수를 완성해주세요
  return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}

정규식 한줄로 끝..

+ Recent posts