멀리 뛰기 (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();})
}

정규식 한줄로 끝..

하샤드 수 (Level 2)

숫자를 매 자리수마다 쪼개기!. number > string > number

문제

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.

예를들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.

Harshad함수는 양의 정수 n을 매개변수로 입력받습니다. 이 n이 하샤드수인지 아닌지 판단하는 함수를 완성하세요.

예를들어 n이 10, 12, 18이면 True를 리턴 11, 13이면 False를 리턴하면 됩니다.

풀이

function Harshad(n){
  let arr = n.toString().split(''), sum = 0;
  for ( let i = 0; i < arr.length; i++ ) {
      sum += parseInt(arr[i])
  }
  if ( n % sum == 0 ) {
    return true
  } else {
      return false
  }
}

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

숫자를 문자열로 바꿔주고 잘라서 배열에 담고, sum에 합해준다.

메서드로 한방에 해줄 방법이 없나 오래 고민을 했는데 딱히 방법이 없는것 같아 아쉽다.

다른 사람의 풀이

function Harshad(n){
  return !(n%(n+'').split('').reduce(function (i, sum) {return +sum + +i;}));
}

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

방법이 없을리가 없지 당연히 있다. 저런 방법으로 접근했는데 string에 연산기호를 붙여 number타입으로 바꾸는 생각!

이 + 기호 하나 또는 *1 /1 로도 사용할수 있지만, 생각해내기는 쉽지 않은것 같다. 외워놔야지ㅋㅋ~

이 코드는 따봉 1개로 부족하다

+ Recent posts