TIL_92. 프로그래머스 JS 코딩 테스트 문제

소고기는레어·2021년 11월 16일
0

TIL 📝

목록 보기
94/96

JS 코딩테스트 연습

2021. 11. 16 (화)


요즘은 React API 위주로 공부하다보니 머리가 뒤죽박죽이 되어버렸다.
아직 배우는 단계이고 React를 실용성 있는 프로젝트에 응용할 수준은 아니다보니 배우면서 지식이 늘어가는 것에 대한 성취감은 있을지 몰라도 어떤 문제를 해결했다 혹은 뭔가를 만들었다는 것에 대한 성취감은 느껴본지 너무 오래되었다.

그래서 오늘은 오랜만에 JS의 기초적인 메소드 등 문법에 대한 복습도 할 겸 프로그래머스의 JS 코딩 테스트 문제를 풀어보기로 했다.

JS로 해결 가능한 문제가 생각보다 많아서 낮은 난이도부터 하나씩 차례대로 풀어볼 예정이다.


문제


평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

function solution(a) {
    return a.reduce((p, c) => p + c) / a.length;
};

reduce() 메소드를 비교적 최근에 알게 되었는데 문제를 보자마자 떠올라서 바로 응용해보았다.


핸드폰 번호 가리기

전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

function solution(phone_number) {
    return phone_number
        .replace(/.{1,}(?=....$)/g, "*".repeat(phone_number.length - 4));
};

정규표현식이 제대로 기억나지 않아서 다소 복잡하게 풀었다. 조금 더 효율적인 표현식으로 대체하기 위해 시간나면 날 잡고 표현식을 조금 더 깊게 공부해 볼 예정이다. 표현식과 일치하는 부분을 한 글자씩 끊어서 *로 대체하고 싶었는데 뭉텅이로 대체되어서 repeat() 메소드를 사용했다. 이 부분도 표현식으로 해결이 가능할 것 같다.


짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

function solution(num) {
    return num % 2 ? "Odd" : "Even";
};

개인적으로 삼항연산자와 논리연산자로 로직을 구현할 때가 가장 기분이 좋다.


하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

function solution(x) {
    let sum = 0;
    let num = x;
    while(num>0) {
        sum += parseInt(num % 10);
        num = parseInt(num/10);
    };
    return !(x%sum);
};

수학에 약해서 처음엔 문자열로 접근해보려 했는데 퍼포먼스를 위해 수학을 택했다.


x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

function solution(x, n) {
    let answer = [];
    for (let i = 1; i <= n; i++) {
        answer.push(x*i);
    };
    return answer;
};

가장 정석적인 방법으로 풀어보았다.


직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const [a, b] = [Number(data.split(" ")[0]), Number(data.split(" ")[1])];
    console.log(`${"*".repeat(a)}\n`.repeat(b));
});

입력값을 구조 분해 할당하여 사용해보았다.


콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.


1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.


예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

function solution(num) {

    if (num === 1) return 0;

    for(let i = 1; i <= 500; i++) {
        num % 2 ? num = num * 3 + 1 : num /= 2
        if (num === 1) return i;
    }; 

    return -1;
};
profile
https://www.rarebeef.co.kr/

0개의 댓글