하샤드 수 (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에 더해주고 리턴

다른 사람의 풀이

모두 같은 방법으로 해결


약수의 합 (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가 리턴되도록 작동함.


+ Recent posts