다음 큰 숫자 (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개로 부족하다

어렵다


미해결

2016년 (Level 2)

get Date(), getDat() 메서드 사용이 핵심

문제

2016년 1월 1일은 금요일입니다. 2016년 A월 B일은 무슨 요일일까요?

두 수 A,B를 입력받아 A월 B일이 무슨 요일인지 출력하는 getDayName 함수를 완성하세요.

요일의 이름은 일요일부터 토요일까지 각각

SUN,MON,TUE,WED,THU,FRI,SAT 를 출력해주면 됩니다.

예를 들어 A=5, B=24가 입력된다면 5월 24일은 화요일이므로 TUE를 반환하면 됩니다.

풀이

function getDayName(a,b){
  let day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
    let date = new Date(`${a}, ${b}, 2016`).getDay()
  return day[date]
}

//아래 코드는 테스트를 위한 코드입니다.
console.log(getDayName(5,24));

day에 요일 이름, date에 입력한 날짜의 요일을 0~6으로 바꿔주는 메소드 사용

이후에 위에 만든 day 배열에 인덱스로 요일 이름을 리턴

다른 사람의 풀이

function getDayName(a,b){
  var date = new Date(2016, (a - 1), b);
    return date.toString().slice(0, 3).toUpperCase();
}

//아래 코드는 테스트를 위한 코드입니다.
console.log(getDayName(5,24));

처음에 시도하려했던 방법인데 출력 방식이 문자열이 아니여서 바로 다른 방법을 택했지만,

위의 코드처럼 toString() 메서드로 해결했으면 더 좋았을 것 같음

최솟값 만들기 (Level 2)

문제

자연수로 이루어진 길이가 같은 수열 A,B가 있습니다.

최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다.

이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.

예를 들어 A = [1, 2] , B = [3, 4] 라면

  1. A에서 1, B에서 4를 뽑아 곱하여 더합니다.
  2. A에서 2, B에서 3을 뽑아 곱하여 더합니다.

수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다.

수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.

풀이

function getMinSum(A,B){
  let min = 0;
  A.sort((a,b) => { return a-b });
  B.sort((a,b) => { return a-b });
  for ( let i = 0; i < A.length; i++ ) {
    min += A[i]*B[A.length-1-i]
  }
  return min
}

//아래 코드는 테스트를 위한 출력 코드 입니다.
var tA = [1,2],
    tB = [3,4];

console.log(getMinSum(tA,tB));

A,B를 오름차순으로 소팅한 뒤에 A는 순서대로, B는 역순으로 곱해 sum에 더해주고 리턴

다른 사람의 풀이

모두 같은 방법으로 해결


+ Recent posts