문제

 

풀이 코드

function solution(n) {
  let num = Math.sqrt(n);
  if (num == Math.floor(num)) return (num + 1) ** 2;
  else return -1;
}

 

풀이 과정

sqrt 함수를 이용하여, 제곱근을 구하고, 

floor 함수를 이용해 소수점 아래 수를 전부 버리고, 제곱근의 값과 같은지 비교하였다. 

이 과정에서 제곱근이 정수인지 판별할 수 있었고,

 

제곱근이 정수라면 다음수의 제곱근을 반환,

제곱근이 정수가 아니라면 -1 을 반환하게 하였다.

문제

 

풀이 코드

function solution(arr) {
  arr.splice(arr.indexOf(Math.min(...arr)), 1);
  return arr.length == 0 ? [-1] : arr;
}

 

풀이 과정

처음에 sort 를 하여, 0인덱스의 값을 제거했다.

이렇게 하고나서 문제를 다시보니 배열의 순서는 유지 되어야한다

 

그래서 Math.min 함수를 통해, 최소값이 있는 해당 인덱스를 구하여 , splice 함수를 적용했다,

단, 제거했을때 배열에 남는값이 없다면, ( 배열의 길이가 0 이라면 ) [-1] 을 return 하게 적용했다.

 

여기서도 Math.min 함수에 처음에 Math.min(arr) 로만 작성했지만, 테스트에서 Fail 되었다..

 

그래서 그 이유를 검색해보니 

Math.min  함수에 배열의 인자 하나하나 전달하기 위해서는 spread 를 사용해야 한다고 MDN 에 나와있었다!

문제

 

풀이 코드

const calcuGCD = (n, m) => {
    return n % m == 0 ? m : calcuGCD(m, n % m);
}

function solution(n, m) {
    let gcd = calcuGCD(n,m);
    let lcm = (n * m) / gcd;
    return [gcd, lcm]
}

 

풀이 과정

최대공약수를 구하기 위해 유클리드 호제법 을 사용하였다.

유클리드 호제법이란?

A , B 의 최대공약수를 구하는 수식
1. 만약 A 를 B 로 나눈 나머지 값이 0이면, 최대공약수는 B가 된다.
2. 그렇지 않다면 A 를 B로 대치하고, B를 A를 B로 나눈 나머지로 대치한다
3. 1번의 조건이 성립될때까지 계속 반복한다.

위의 조건을 재귀함수를 통하여 코드로 구현하면

function GCD(A,B) {
	if (A % B == 0) {
    	return B;
    }
    else {
    	return GCD(B, A % B);
    }
 }

위와 같이 나타낼수 있다! 

위의 코드를 기반으로 삼항연산을 적절히 섞어 구현하였고,

 

최소공배수는 두수를 곱하고, 최대공약수로 나눈 값이 된다!

 

다른사람의 코드

function gcdlcm(a, b) {
    var r;
    for(var ab= a*b;r = a % b;a = b, b = r){}
    return [b, ab/b];
}

이 코드는 좀 신기해서 가져왔다.

for문을 이용하여 구현하였다

 

대박

문제

 

풀이 코드

function solution(num) {
  let count = 0;

  while (num !== 1) {
    num = num % 2 === 0 ? num / 2 : num * 3 + 1;
    count++;
  }
  return count < 500 ? count : -1;
}

 

풀이 과정

간단하게 삼항연산자 를 통하여 구현하였다.

코드를 너무 간단하게 구현 하였기 때문에 설명은 생략!

문제

 

풀이 코드

function solution(x) {
  let stringTox = x + '';
  let sum;
  sum = stringTox.split('').reduce((s, current) => s + current * 1, 0);

  return x % sum === 0;
}

 

풀이 과정

문자열 함수, 배열 함수를 사용하여 구현 하였다!

 

1) x 에 '' 빈 문자를 더하여 String 으로 변환하고, 이를 stringTox 변수에 담았다.

2) split 함수를 이용해 문자열의 각 요소를 배열로 만들었고, 해당 배열을 reduce 함수를 통해 모두 더해주었다, 더한 값을 sum 에 저장

3) x 와 sum 과의 나머지 연산에서 나머지가 없으면 하샤드 수 true 를 반환하게 구현했다.

 

슬슬 자바스크립트의 문자열과 배열의 함수에 대해 조금씩 익숙해 지고 있는거 같아 뿌듯하다!!! ㅎㅎ

 

다른사람의 코드

function solution(x) {
    let num = x;
    let sum = 0;
    do {
        sum += x%10;
        x = Math.floor(x/10);
    } while (x>0);

    return !(num%sum);
}

함수를 사용해서 구현하는것도 좋지만, 

반응을 보니 아무래도 수학적으로 접근하는게 더 빠르다고 한다

 

물론 이런 간단한 문제에서는 효율이 차이가 나봤자 이지만

프로그래밍적으로 생각하면 속도도 중요하니 너무 함수에 의존하면 안되겠다.

+ Recent posts