약수의 합 (Level 1)

문제

어떤 수를 입력받아 그 수의 약수를 모두 더한 수 sumDivisor 함수를 완성해 보세요.

예를 들어 12가 입력된다면 12의 약수는 [1, 2, 3, 4, 6, 12]가 되고, 총 합은 28이 되므로 28을 반환해 주면 됩니다.

풀이

function sumDivisor(num) {
  let sum = 0;
    for ( let i = 1; i <= num; i++ ) {
      if ( num % i == 0 ) {
        sum += i
    }
  }
  return sum
}

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

1부터 num까지 모든 수에 대해 나머지가 0 인수를 sum에 더해줘서 리턴

다른 사람의 풀이

다 비슷하지만 내 코드가 가장 나은듯 함


피보나치 수 (Level 1)

문제

피보나치 수는 F(0) = 0, F(1) = 1일 때, 2 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 점화식입니다.

2 이상의 n이 입력되었을 때, fibonacci 함수를 제작하여 n번째 피보나치 수를 반환해 주세요. 예를 들어 n = 3이라면 2를 반환해주면 됩니다.

풀이

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

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

재귀 함수로 풀어보려 했으나 시간초과로 다른 방법으로 접근

내가 푼 방법이 Dynamic Programming이 맞는지 모르겠지만 따라하려 해봄ㅋㅋ

배열에 fibonacci(0), fibonacci(1)을 할당해놓고 다음 순서를 push로 배열뒤에 삽입하는 식으로 연산에서 중복되는 결과를 최대한 줄이려 함

다른 사람의 풀이

function fibonacci(num) {
  if(num < 2) return num;

  return fibonacci(num-1) + fibonacci(num-2);
}

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

나는 이렇게 쓰면 통과 안되던데 어떻게 되는거지..

아무튼 위에서 말한 재귀함수로 구현한 방법이 이것!

행렬의 덧셈 (Level 1)

문제

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.

예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다.(어떠한 행렬에도 대응하는 함수를 완성해주세요.)

풀이

function sumMatrix(A,B){
    var result = [];
    for(var i = 0; i < A.length; i++){
        result[i] = [];
            for(var j = 0; j < A[i].length; j++){
                result[i][j] = A[i][j] + B[i][j];
            }
        }
    return result;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

배열 안에 A의 길이만큼 배열을 생성해 A,B의 합을 각각 할당

다른 사람의 풀이

function sumMatrix(A,B){
    return A.map((a,i) => a.map((b, j) => b + B[i][j]));
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

맵을 이중으로 써서 새로운 배열을 만든다.

익히면 좋을듯한 테크닉


최대공약수와 최소공배수 (Level 1)

문제

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환해주는 gcdlcm 함수를 완성해 보세요.

배열의 맨 앞에 최대공약수, 그 다음 최소공배수를 넣어 반환하면 됩니다.

예를 들어 gcdlcm(3,12) 가 입력되면, [3, 12]를 반환해주면 됩니다.

풀이

function gcdlcm(a, b) {
  let gcd = 1, lcm = 1;
  for (let i = 1; i <= Math.min(a,b); i++) {
      if ((a%i == 0) && (b%i == 0)) {
        gcd = i
    }
  }
  lcm = a*b/gcd
  return [gcd, lcm]
}

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

s에서 p와 y가 매치되는 배열의 길이가 같을 때, p와y의 개수가 0개일 때, 나머지 경우로 나눠 조건문 생성

다른 사람의 풀이

function greatestCommonDivisor(a, b) {return b ? greatestCommonDivisor(b, a % b) : Math.abs(a);}
function leastCommonMultipleOfTwo(a, b) {return (a * b) / greatestCommonDivisor(a, b);}
function gcdlcm(a, b) {
    return [greatestCommonDivisor(a, b),leastCommonMultipleOfTwo(a, b)];
}

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

재귀함수를 통한 최대공약수 구하기. 상당히 신기하고 이해하는데 시간이 좀 걸렸지만, 유용하게 사용할 수도 있을듯함

그냥 첫줄만 써주면 되는거였다..

p, y 둘다 0인경우도 어짜피 0으로 동일하기 때문에 두 조건을 합쳐주고 나머지는 자동으로 false가 리턴되도록 작동함.


문자열 내 p와 y의 개수 (Level 1)

문제

numPY함수는 대문자와 소문자가 섞여있는 문자열 s를 매개변수로 입력받습니다.

s에 ‘p’의 개수와 ‘y’의 개수를 비교해 같으면 True, 다르면 False를 리턴하도록 함수를 완성하세요.

‘p’, ‘y’ 모두 하나도 없는 경우는 항상 True를 리턴합니다.

예를들어 s가 “pPoooyY”면 True를 리턴하고 “Pyy”라면 False를 리턴합니다.

풀이

function numPY(s){
  if ( s.match(/p/gi).length == s.match(/y/gi).length ) {
    return true
  } else if ( /p|y/gi == 0 ) {
      return true
  } else {
    return false
  }
}

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

s에서 p와 y가 매치되는 배열의 길이가 같을 때, p와y의 개수가 0개일 때, 나머지 경우로 나눠 조건문 생성

다른 사람의 풀이

function numPY(s) {
  return s.match(/p/ig).length == s.match(/y/ig).length;
}

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

그냥 첫줄만 써주면 되는거였다..

p, y 둘다 0인경우도 어짜피 0으로 동일하기 때문에 두 조건을 합쳐주고 나머지는 자동으로 false가 리턴되도록 작동함.


문자열 다루기 기본 (Level 1)

문제

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

s의 길이가 4혹은 6이고, 숫자로만 구성되있는지 확인해주는 함수를 완성하세요.

예를들어 s가 “a234”이면 False를 리턴하고 “1234”라면 True를 리턴하면 됩니다.

풀이

function alpha_string46(s){
  if ((s.length == 4 || s.length == 6) && (s.match(/\D/gi) != 0)) {
      return true
  } else {
      return false
  }
}

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

필요한 조건을 그대로 구현했음.

다른 사람의 풀이

function alpha_string46(s){
  var result = false;
  if((s.length == 4 || s.length == 6) && /^[0-9]+$/.test(s)) {
    result = true;
  }
  return result;
}

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

/^[0-9]+$는 전체가 숫자열인지 확인

test는 문자열 안에 정규식 패턴이 있는지 확인할 때 사용하며, 있으면 true 없으면 false 반환


삼각형 출력하기 (Level 1)

문제

printTriangle 메소드는 양의 정수 num을 매개변수로 입력받습니다.

다음을 참고해 *(별)로 높이가 num인 삼각형을 문자열로 리턴하는 printTriangle 메소드를 완성하세요

printTriangle이 return하는 String은 개행문자(‘\n’)로 끝나야 합니다.

높이가 3일때

*
**
***

풀이

function printTriangle(num) {
  let res = '';
  for (let i = 1; i <= num; i++ ) {
      res += "*".repeat(i) + "\n"
  }
  return res
}


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

역삼각형 별찍기에서 다른사람이 만든 코드처럼 한줄로 줄이고 싶었지만 너무 어렵다.

다른 사람의 풀이

다 비슷비슷한 코드


서울에서 김서방 찾기 (Level 1)

문제

findKim 함수(메소드)는 String형 배열 seoul을 매개변수로 받습니다.

seoul의 element중 “Kim”의 위치 x를 찾아, “김서방은 x에 있다”는 String을 반환하세요.

seoul에 “Kim”은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

풀이

function findKim(seoul){
  return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}

// 실행을 위한 테스트코드입니다.
console.log( findKim(["Queen", "Tod", "Kim"]));

템플릿 문자열로 한줄에 처리

indexOf로 배열에서 위치를 찾아냄

다른 사람의 풀이

내 코드가 가장 맘에 든다ㅎㅎ


+ Recent posts