문제:
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

풀이보기
더보기
function 최대공약수(x, y) {
    while (y !== 0) {
        let temp = y;
        y = x % y;
        x = temp;
    }
    return x;
}

function 최소공배수(x, y) {
    for(let i = 1; ; i++) {
        let check = true;
        
        if((y * i) % x !== 0) {
            check = false;
        }
        
        if(check) {
            return y * i;
        }
    }
}

function solution(n, m) {
    return [최대공약수(n, m), 최소공배수(n, m)];
}

단순히 두 수의 최대공약수와 최소공배수를 구하는 문제이므로

최대공약수를 반환하는 함수와 최소공배수를 반환하는 함수를 따로 만들어주었다.

근데 공식을 보면 두 수의 곱을 최대공약수로 나눠주면 최소공배수라고 한다 ㅎㅎ .. 

 그럼 아래와 같이 바꿀 수 있다.

function 최대공약수(x, y) {
    while (y !== 0) {
        let temp = y;
        y = x % y;
        x = temp;
    }
    return x;
}

function solution(n, m) {
    return [최대공약수(n, m), (n * m) / 최대공약수(n, m)];
}

 

문제:
3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다.
3x 마을 사람들의 숫자는 다음과 같습니다.
10진법 3x 마을에서 쓰는 숫자 10진법 3x 마을에서 쓰는 숫자
1 1 6 8
2 2 7 10
3 4 8 11
4 5 9 14
5 7 10 16
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/120871?language=javascript

 

풀이보기
더보기
function solution(n) {
    let result = {};
    let count = 0;
    
    for(let i = 1; i <= n; i++) {
        let num = i + count;

        while (num.toString().includes('3') || num % 3 === 0) {
            count++;
            num = i + count;
        }

        result[i] = num;
    }
    
    return result[n];
}

나는 10진수와 마을에서 쓰는 수를 매칭시키기위해 객체를 사용했다.

for문을 이용해서 result[i] = i + count 형태로 객체에 삽입을 시켜줄 것이다.

3의 배수이거나 3이 포함되면 count 증가시켜줄 것이다.

근데 여기서 저 두 조건에 해당되지 않는 숫자여야하므로 조건에 해당되지 않는 숫자를 만날 때 까지 while문을 돌려준다.

그럼 이제 마지막에는 result 객체에서 n의 키 값을 반환해주면 끝 !

 

문제:
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다.
이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다.
단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다.
예를 들면,
  - arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  - arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

풀이보기
더보기
function solution(arr) {
    return arr.filter((_, i) => arr[i] !== arr[i + 1]);
}

연속된 숫자를 제거한 배열을 반환해야하므로,

filter를 사용해서 현재 수와 그 다음 수를 비교하여 같지 않은 경우에만 반환해주면 끝이다.

 

문제:
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요.
예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12918

 

풀이보기
더보기
function solution(s) {
    let isNum = true;
    
    s.split('').forEach((char) => {
        if(char != Number(char)) {
            isNum = false;
        }
    })
    
    return isNum && (s.length === 4 || s.length === 6) ? true : false;
}

나는 한글자씩 순회해서 숫자가 아닌 경우 isNum을 false로 바꾸는 방식을 선택했다.

문자열을 순회하고 난 후 isNum과 문자열의 길이가 충족되면 true, 아니면 false가 되도록 했다.

 

다른 사람들 풀이를 보고 아래와 같이 다시 풀어보았다.

return s.length === 4 || s.length === 6 ? !isNaN(Number(s)) : false;

하지만 위의 코드는 만약 s가 0x16이라면 16진수로 바꾸기 때문에 테스트 케이스를 통과하지 못한다.

 

문제:
덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다.
수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/120907?language=javascript

 

풀이보기
더보기
function solution(quiz) {
    let result = [];
    
    for(let i = 0; i < quiz.length; i++) {
        let [left, right] = quiz[i].split('=');
        
        eval(left) === Number(right) ? result.push('O') : result.push('X');
    }
    
    return result;
}

 처음에는 for 문을 이용해서 문제를 풀어보았다.

'='을 기준으로 배열 변환해주고, 각각 left와 right에 저장해준다.

eval은 문자열을 그대로 실행해주는 함수로 left를 계산해준뒤 right랑 비교해서 OX를 반환해주면 된다.

 

function solution(quiz) {
    return quiz.map((val) => {
        let [left, right] = val.split('=');
        
        return eval(left) === Number(right) ? "O" : "X";
    })
}

OX를 담은 배열로 반환해야하므로 map을 사용하면 더 간결하게 코드를 작성할 수 있다.

 

문제:
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12917

 

풀이보기
더보기
function solution(s) {
     let lowercase = [];
     let uppercase = [];
    
     for (let char of s) {
         char === char.toLowerCase() ? 
             lowercase.push(char) : uppercase.push(char);
     }

     lowercase.sort((a, b) => b.localeCompare(a));
     uppercase.sort((a, b) => b.localeCompare(a));

     return lowercase.join('') + uppercase.join('');
}

처음 풀이는 단순히 소문자와 대문자를 나누어서 각 배열에 push 했고, 

그 뒤에 각 배열을 정렬해서 붙이는 방식으로 구현했다.

근데 다른 사람풀이를 보며 애초에 sort가 알파벳을 정렬해주는 기능이 있는 줄 처음 알았다 ㅎㅎ;

 

function solution(s) {
     return s.split("").sort().reverse().join("");
}

이렇게 하면 한 줄로 간편하게 문제를 풀 수 있다.

먼저 split을 통해 문자열을 배열로 변환하고, sort를 통해 알파벳을 오름차순으로 정렬한다.

게다가 sort로 대문자도 알아서 정렬이 된다는 사실도 처음 알았다 ㅎ .. 

이렇게 정렬한 배열을 reverse로 뒤집어주면 내림차순이 될테고 마지막으로 join을 통해 다시 문자열로 변환해주면 끝!

 

문제:
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다.
a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/70128

 

풀이보기
더보기
function solution(a, b) {
     let sum = 0;
    
     a.forEach((val, i) => {
         sum += val * b[i];
     })
    
     return sum;
}

 처음에는 forEach를 사용해서 값을 구해주었다.

근데 또 다른 사람 풀이를 보다가 reduce의 존재를 인지했다 ㅎㅎ;

 

function solution(a, b) {
   return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
}

reduce를 활용해서 더 간결한 코드를 작성할 수 있지만 가독성 측면에서는 첫번째 코드보다 안좋을 수 있다.

 

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

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12950?language=javascript

 

풀이보기
더보기
function solution(arr1, arr2) {
    let result = [];
    
    for(let i = 0; i < arr1.length; i++) {
        result[i] = [];
        
        for(let j = 0; j < arr1[i].length; j++) {
            result[i].push(arr1[i][j] + arr2[i][j]);
        }
    }
    return result;
}

 for문에서 result[i] = []를 통해 i 값에 맞게 빈배열을 먼저 넣어주고,

그 다음 for문에서 각 인덱스에 맞게 더해서 push 해주면 된다 !

처음에 작성한 코드도 가독성이 좋다고 생각하지만 다른 사람의 풀이를 보고 map을 사용해서 다시 풀어보았다.

 

function solution(arr1, arr2) {
  return arr1.map((array, i) => array.map((value, j) => value + arr2[i][j]));
}

map은 새로운 배열을 반환해주기 때문에 따로 선언해줄 필요가 없었고 더 간결하고 효율적인 코드가 완성되었다.

 

+ Recent posts