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

drrobot409·2021년 11월 17일
0

TIL 📝

목록 보기
95/96

JS 코딩테스트 연습

2021. 11. 17 (수)


문제


제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

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

splice 메소드는 원본이 수정되는 것으로 알고 있었는데 계속 자른 부분이 반환되어서 잠깐 고민을 했으나 메소드의 결과를 변수에 할당하거나 직접 리턴할 경우 자른 부분이 저장된다는 사실을 떠올려냈다. 잊고 있었던 사실을 상기할 수 있는 문제였다.


정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

function solution(n) {
    return parseInt(n.toString().split("").sort().reverse().join(""));
};

정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

function solution(n) {
    return Number.isInteger(n ** 0.5) ? (n ** 0.5 + 1) ** 2 : -1;
};

n에 0.5를 제곱했을 때 정수인지 판별 후 삼항 연산자를 이용하여 정수일 경우 문제에서 요구하는 식을 계산하여 리턴하고 정수가 아닐 경우 -1을 리턴하는 방법을 사용했다.


자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

function solution(n) {
    return n > 10 ? n.toString().split("").reduce((prev, curr) => parseInt(prev) + parseInt(curr)) : n
};

처음엔 삼항연산자 없이 메소드 체이닝 부분만 리턴했는데 테스트 결과에서 한 문제가 실패했다.
실패한 n의 값을 특정할 수 없었지만 혹시 n의 값이 한자리 수여서 실패하지 않았을까라는 생각에 삼항연산자를 추가하여 n이 10보다 작을 경우 n을 그대로 리턴하도록 리팩토링하여 테스트를 통과했다.

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

문자열을 사용하지 않는 로직도 작성해보았다. 한자리 수의 경우를 체크하지 않아도 된다.


자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

function solution(n) {
    return n.toString().split("").map(el => parseInt(el)).reverse();
};

문자열을 사용하지 않는 로직도 작성해보았다.

function solution(n) {
    let arr = [];
    
    while (n > 0) {
        arr.push(parseInt(n % 10));
        n = parseInt(n / 10);
    };
    
    return arr;
};

이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

function solution(s) {
    let arr = s.split(" ");
    let temp = "";
    
    arr.map((el, i) => {
        
        for (let j = 0; j < el.length; j++) {
            temp += (j%2 ? el[j].toLowerCase() : el[j].toUpperCase())
        };
        
        arr.splice(i, 1, temp);
        temp = "";
    });

    return arr.join(" ");
};

문자열을 한글자씩 끊어서 배열로 저장한 후 인덱스에 맞춰 대/소문자로 변환하였다.
변환한 단어는 temp라는 변수에 담아서 배열의 원래 자리에 덮어쓰고 temp는 초기화한다.


약수의 합

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

function solution(n) {
    let answer = n;
    
    for (let i = 1; i <= n/2; i++) {
        if (!(n%i)) answer += i;
    };
    
    return answer;
};

1씩 더해가며 전부 대입 해보는 것 보다 더 효율적인 방법이 있을까 거의 1시간을 고민해봤는데 어차피 대입은 컴퓨터가 하기 때문에 다 대입하는게 가장 빠르고 덜 복잡한 것 같아서 위 로직으로 결정했다.

profile
개발자로 자기 개발 중

0개의 댓글