문제

 

풀이 코드

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);
}

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

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

 

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

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

문제

 

풀이 코드

function solution(phone_number) {
  let starlen = phone_number.length - 4;
  return '*'.repeat(starlen) + phone_number.slice(-4);
}

 

풀이 과정

처음에 replace 를 생각했다 이걸 적용하려면 정규식을 잘 써야 하는데 

정규식에 대한 지식이 부족했다..

정규식으로 풀면 한줄이면 끝날거같았는데.. 도저히 생각이 나지 않아 다른 방법으로 구현 하였다.

 

repeat(숫자) : 숫자만큼 반복함

slice(인덱스) : 해당 인덱스 부터 끝까지의 문자열만 반환함

 

다른사람의 풀이

function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}

정규식으로 풀어내셨다

정규식을 풀어 해석하면 다음과 같이 된다.

/g : 모든 문자열에 대해서 적용
\d : 모든 숫자
x(?=y) : y에 대한 조건을 허용하는 것을 뒤따라오는 x에만 대응된다. 대응 되면 x의 값을 바꾼다.
x(?!y) : x에 대한 조건을 허용하는 것을 뒤따라오는 y에만 대응된다. 대응 되면 x의 값을 바꾼다.
{n} :  앞 표현식이 n번 나타나는 부분에 대응

문제

 

풀이 코드

function solution(s) {
    return parseInt(s);
}

 

풀이 과정

생략

+ Recent posts