야근지수 (Level 3)

문제

야근 지수

회사원인 수민이는 많은 일이 쌓여 있습니다.

수민이는 야근을 최소화하기 위해 남은 일의 작업량을 숫자로 메기고, 일에 대한 야근 지수를 줄이기로 결정했습니다.

야근 지수는 남은 일의 작업량을 제곱하여 더한 값을 의미합니다.

수민이는 1시간 동안 남은 일 중 하나를 골라 작업량 1만큼 처리할 수 있습니다.

수민이의 퇴근까지 남은 N 시간과 각 일에 대한 작업량이 있을 때, noOvertime 함수를 제작하여 수민이의 야근 지수를 최소화 한 결과를 출력해 주세요.

예를 들어, N=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 일을 한 결과는 [2, 2, 2]가 되고 야근 지수는 22 + 22 + 22 = 12가 되어 12를 반환해 줍니다.

풀이

function noOvertime(no, works) {
  let arr =works.replace(/\[/,'').replace(/\]/,'').split(",")
  for ( let i = 0; i < arr.length; i++ ) {
      arr[i] = +arr[i]
  }
  for ( let j = 0; j < no; j++ ) {
      arr.sort((a,b) => { return b-a });
    arr[0] = arr[0] - 1
  }
    return arr.map((x) => { return x*x }).reduce((a,b) => { return a+b})
}
console.log(noOvertime(4,"[4,3,3]"))
function noOvertime(no, works) {
  let k = 0;
  let arr =works.replace(/\[/,'').replace(/\]/,'').split(",")
  for ( let i = 0; i < arr.length; i++ ) {
      arr[i] = +arr[i]
  }
  arr.sort((a,b) => { return b-a });
   while ( k < no ) {
    for ( let j = 0; j < arr.length-1; j++ ) {
        if ( arr[j] > arr[j+1] ) {
          k += arr[j]-arr[j+1]
        let l = arr[j] - arr[j+1]
        arr[j] = arr[j] - l
      }
    }
    return arr.map((x) => { return x*x }).reduce((a,b) => { return a+b})
  }
}

console.log(noOvertime(4,"[4,3,3]"))

내가 잘모르는건지 애초에 문제가 이상한건지..

완전 하드스트레스

다른 사람의 풀이

통과못함


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() 아는건데 못생각했다. 문제가 심각함

생각하고 코드적기!

+ Recent posts