코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (12)

천서리 2023. 5. 27. 13:40
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 12 문자열, 정렬, 사칙연산, 수학

출처 : https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


모음 제거

문제

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • my_string은 소문자와 공백으로 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000

 

입출력 예

my_string result
"bus" "bs"
"nice to meet you" "nc t mt y"

 

입출력 예 설명

 

입출력 예 #1

  • "bus"에서 모음 u를 제거한 "bs"를 return합니다.

입출력 예 #2

  • "nice to meet you"에서 모음 i, o, e, u를 모두 제거한 "nc t mt y"를 return합니다.

 

solution.js

function solution(my_string) {
    var vowels = ['a', 'e', 'i', 'o', 'u'];
    var answer = '';
    
    for (var i = 0; i < my_string.length; i++) {
        var char = my_string[i];
        
        if (!vowels.includes(char)) {
            answer += char;
        }
    }
    
    return answer;
}
  1. 우선 vowels라는 배열에 모음을 나타내는 문자들인 'a', 'e', 'i', 'o', 'u'를 저장합니다. 그리고 answer라는 빈 문자열로 초기화합니다. 이 변수는 결과 문자열을 저장할 용도로 사용됩니다.
  2. for 반복문은 주어진 문자열의 각 문자를 순회하기 위해 사용됩니다. i 변수는 0부터 my_string.length보다 작을 때까지 1씩 증가하며 반복합니다.
  3. 반복문 내부에서는 현재 문자를 char 변수에 할당합니다 (my_string[i]). 그리고 vowels.includes(char)를 사용하여 현재 문자가 모음인지 확인합니다. includes 메서드는 배열에 특정 요소가 포함되어 있는지 여부를 확인하는데 사용됩니다. 만약 현재 문자가 모음이 아니라면, 즉 includes의 결과가 false라면, answer에 현재 문자를 추가합니다 (answer += char).
  4. 모든 문자에 대해 반복문이 실행되고 나면, answer 변수에는 주어진 문자열에서 모음을 제외한 나머지 문자들로 이루어진 문자열이 저장되어 있습니다. 이 값을 return하여 반환합니다.

예를 들어, my_string이 "hello"인 경우, 반복문을 통해 'h', 'l', 'l'을 answer에 추가하고, 모음인 'e', 'o'는 제외됩니다. 따라서 함수는 "hll"을 반환합니다.


문자열 정렬하기 (1)

문제

문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.

 

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 100
  • my_string에는 숫자가 한 개 이상 포함되어 있습니다.
  • my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다. - - -

 

입출력 예

my_string result
"hi12392" [1, 2, 2, 3, 9]
"p2o4i8gj2" [2, 2, 4, 8]
"abcde0" [0]

 

입출력 예 설명

 

입출력 예 #1

  • "hi12392"에 있는 숫자 1, 2, 3, 9, 2를 오름차순 정렬한 [1, 2, 2, 3, 9]를 return 합니다.

입출력 예 #2

  • "p2o4i8gj2"에 있는 숫자 2, 4, 8, 2를 오름차순 정렬한 [2, 2, 4, 8]을 return 합니다.

입출력 예 #3

  • "abcde0"에 있는 숫자 0을 오름차순 정렬한 [0]을 return 합니다.

 

solution.js

function solution(my_string) {
    var numbers = [];

    for (var i = 0; i < my_string.length; i++) {
        var char = my_string[i];

        if (!isNaN(char)) {
            numbers.push(Number(char));
        }
    }

    numbers.sort((a, b) => a - b);

    return numbers;
}
  1. 이 코드는 주어진 문자열 my_string에서 숫자를 추출하여 배열에 저장하고, 해당 배열을 오름차순으로 정렬하여 반환하는 함수인 solution을 정의하고 있습니다.
  2. 코드의 실행 흐름을 살펴보면, 먼저 빈 배열인 numbers를 선언합니다. 이 배열은 추출한 숫자들을 저장할 용도로 사용됩니다.
  3. for 반복문은 i 변수를 0부터 my_string.length보다 작을 때까지 1씩 증가시키며 문자열을 순회합니다.
  4. 반복문 내부에서는 현재 문자를 char 변수에 할당합니다 (my_string[i]). 그리고 isNaN(char)을 사용하여 현재 문자가 숫자인지 확인합니다. isNaN 함수는 주어진 값이 숫자인지 확인하는데 사용됩니다. 만약 현재 문자가 숫자라면, 즉 isNaN의 결과가 false라면, char를 숫자로 변환한 후 numbers 배열에 push하여 추가합니다 (numbers.push(Number(char))).
  5. 모든 문자에 대해 반복문이 실행되고 나면, numbers 배열에는 주어진 문자열에서 추출한 숫자들이 저장되어 있습니다. 이후 numbers.sort((a, b) => a - b)를 사용하여 배열을 오름차순으로 정렬합니다. sort 메서드는 배열의 요소를 정렬하는데 사용되며, 비교 함수를 제공할 수 있습니다. 여기서는 비교 함수로 (a, b) => a - b를 사용하였습니다. 이 함수는 ab를 비교하여 a - b의 결과를 반환하는데, 이는 오름차순으로 정렬하기 위해 사용됩니다.
  6. 마지막으로, 정렬된 numbers 배열을 return하여 반환합니다.

예를 들어, my_string이 "a1b3c2"인 경우, 반복문을 통해 '1', '3', '2'를 numbers 배열에 추가하고, 문자나 숫자가 아닌 'a', 'b', 'c'는 제외됩니다. 그 후 numbers 배열은 [1, 2, 3]이 되고, 함수는 이 배열을 반환합니다.


숨어있는 숫자의 덧셈 (1)

문제

문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.

 

입출력 예

my_string result
"aAb1B2cC34oOp" 10
"1a2b3c4d123" 16

 

입출력 예 설명

 

입출력 예 #1

  • "aAb1B2cC34oOp"안의 한자리 자연수는 1, 2, 3, 4 입니다. 따라서 1 + 2 + 3 + 4 = 10 을 return합니다.

입출력 예 #2

  • "1a2b3c4d123Z"안의 한자리 자연수는 1, 2, 3, 4, 1, 2, 3 입니다. 따라서 1 + 2 + 3 + 4 + 1 + 2 + 3 = 16 을 return합니다.

유의사항

  • 연속된 숫자도 각각 한 자리 숫자로 취급합니다.

 

solution.js

function solution(my_string) {
    const answer = my_string.replace(/[^0-9]/g, '')
                .split('')
                .reduce((acc, curr) => acc + Number(curr), 0);
    return answer;
}
  1. replace 메서드를 사용하여 정규표현식 /[^0-9]/g에 매칭되는 문자열을 빈 문자열('')로 대체합니다. /[^0-9]/g는 숫자가 아닌 모든 문자를 찾기 위한 정규표현식입니다. 따라서, my_string에서 숫자가 아닌 모든 문자들을 제거합니다.
  2. 그 다음, split 메서드를 사용하여 문자열을 배열로 변환합니다. 각 숫자는 배열의 요소로 들어가게 됩니다.
  3. reduce 메서드는 배열의 요소들을 하나로 축소하는데 사용됩니다. 초기값으로 0을 설정하고, reduce 메서드는 각 요소를 순회하면서 현재 요소를 Number로 변환하여 이전까지의 누적값 acc에 더해줍니다. 이렇게 계산된 최종 누적값이 answer에 저장됩니다.
  4. 마지막으로, answer 값을 반환합니다. 이 값은 주어진 문자열에서 추출한 숫자들의 합을 나타냅니다.

예를 들어, my_string이 "a1b3c2"인 경우, replace 메서드에 의해 "132"가 되고, split 메서드에 의해 ["1", "3", "2"] 배열로 변환됩니다. 그 후 reduce 메서드를 통해 요소들의 합인 6이 answer로 반환됩니다.


소인수분해

문제

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 2 ≤ n ≤ 10,000

 

입출력 예

n result
12 [2, 3]
17 [17]
420 [2, 3, 5, 7]

 

입출력 예 설명

 

입출력 예 #1

  • 12를 소인수분해하면 2 * 2 * 3 입니다. 따라서 [2, 3]을 return합니다.

입출력 예 #2

  • 17은 소수입니다. 따라서 [17]을 return 해야 합니다.

입출력 예 #3

  • 420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.

 

solution.js

function solution(n) {
    var answer = [];
    var divisor = 2;

    while (n !== 1) {
        if (n % divisor === 0) {
            answer.push(divisor);
            n /= divisor;
        } else {
            divisor++;
        }
    }
    answer = [...new Set(answer)];

    return answer;
}
  1. 먼저 빈 배열인 answer를 선언합니다. 이 배열은 소인수를 저장할 용도로 사용됩니다.
  2. divisor라는 변수를 선언하고 초기값을 2로 설정합니다. 이 변수는 가장 작은 소인수인 2부터 시작하여 n을 나누어 소인수를 찾는 데 사용됩니다.
  3. while 반복문은 n이 1이 아닐 때까지 계속해서 반복됩니다. 반복문 내부에서는 현재 divisorn의 소인수인지 확인합니다. 만약 ndivisor로 나눈 나머지가 0이라면, 즉 n % divisor === 0인 경우, divisorn의 소인수입니다. 이때 answer 배열에 divisor를 추가합니다 (answer.push(divisor)). 그리고 ndivisor로 나누어서 다음 숫자를 확인합니다 (n /= divisor).
  4. 만약 divisorn의 소인수가 아니라면, 다음 소수로 넘어가기 위해 divisor를 1씩 증가시킵니다 (divisor++).
  5. while 반복문이 종료되면, answer 배열에는 n의 소인수들이 중복 포함되어 저장되어 있을 수 있습니다. 따라서 중복된 소인수를 제거하기 위해 answer 배열을 Set 객체로 변환하고, 다시 배열로 변환하여 중복을 제거합니다 ([...new Set(answer)]).
  6. 마지막으로, 중복이 제거된 answer 배열을 반환합니다.

예를 들어, n이 28인 경우, 28의 소인수는 2와 7입니다. 따라서 answer 배열은 [2, 2, 7]이 되고, 중복이 제거된 후 [2, 7]이 반환됩니다.

반응형
Adventure Time - BMO