코딩테스트/프로그래머스

[프로그래머스] 입문 Day 12 문자열, 정렬, 사칙연산, 수학 (Javascript)

꼽파 2024. 1. 13. 11:00


모음 제거

문제 설명

  • 영어에선 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

배열로 만들어서 filter와 includes 사용

function solution(my_string) {

    const vowels = ["a", "e", "i", "o", "u"]
    var answer = '';
    // 문자열 split('')으로 배열로 만들기
    // 모음에 해당하는 원소는 넣지 않기

    answer = my_string.split('').filter(a => !vowels.includes(a)).join('');

    return answer;

    }

 

풀이 2

replace와 정규표현식

function solution(my_string) {
    return my_string.replace(/[aeiou]/g,'');
}

/[ ]/ : 배열 안 원소 중 어떤 하나와 일치하는 것을 찾음.

g : 전역검색을 나타냄. 문자열 전체를 탐색함.

 

풀이 3

case문과 splice

function solution(my_string) {
    var answer = my_string.split('');
    for(let i = 0; i < answer.length; i++){
        switch(answer[i]){
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                answer.splice(i, 1);  // i번째에서 1개 제거
                i--;
                break;
        }
    }

    return answer.join('');
}

 

a, e, i, o, u일때만 splice함수가 실행되는 것으로 이 풀이는 정말 참신하다고 생각한다.

 

참고

Switch Case문 구조

function exampleSwitch(value) {
  switch (value) {
    case 'a':
      console.log('알파');
      break;
    case 'b':
      console.log('베타');
      break;
    case 'c':
      console.log('캐릭터');
      break;
    default:
      console.log('기타');
  }
}

exampleSwitch('b'); // 출력: "베타"
exampleSwitch('x'); // 출력: "기

여기서 break 붙여주는 것에 따라 실행 여부가 달라지니까 주의해야함.


문자열 정렬하기 (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

match(정규표현식), map

function solution(my_string) {
    return my_string
        .match(/\d/g)
        .sort((a, b) => a - b)
        .map(el => Number(el))

· match 메서드 : 정규 표현식에 매칭되는 부분을 배열로 반환하거나 매칭되는 부분이 없으면 null을 반환

· \d : 숫자
· g : 전역 검색

 

풀이 2

for 반복문으로 원소 순회

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

    for (i = 0; i < my_string.length; i++) {
        if (my_string[i] >=0 && my_string[i] <= 9) {
            answer.push(Number(my_string[i]))
        }
    }
    answer.sort((a, b) => a - b)
    return answer;
}

 

풀이 3

filter로 isNaN 사용

function solution(my_string) {
  return my_string
    .split("")
    .filter((char) => !isNaN(char))
    .map((number) => parseInt(number))
    .sort((a, b) => a - b);
}

 

isNaN(value)는 어떤 값이 NaN인지 판별하여 true나 false를 반환

let a = isNaN("안녕")
console.log(a)  // true

let b = isNaN(12345)
console.log(b)  // false

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

문제 설명

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

제한사항

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

입출력 예

my_string result
"aAb1B2cC34oOp" 10
"1a2b3c4d123" 16

 

풀이 1

숫자만 있는 배열 생성 후 기존 문자열을 변환한 배열과 비교하여 reduce로 합 구하기

function solution(my_string) {
    // 문자열 안에 숫자 여부 확인
    // 배열에 다 넣어 두고 reduce로 합 구하기
    
    const num = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
    const answer = [];
    
    arr = my_string.split('')
    
    for (str of arr) {
         if (num.includes(str)) {  
             answer.push(parseInt(str));
        }
    }
    return answer.reduce((acc, cur) => acc + cur, 0);
}

 

풀이 2

정규표현식으로 숫자만 추려내기

function solution(my_string) {
    return my_string
            .match(/[0-9]/g)  // 숫자만 추려내기
            .reduce((acc, cur) => acc + parseInt(cur), 0)  // 합 구하기 (정수로 변환)
}
let inputString = "Hello123World";

let nonNumericCharacters = inputString.replace(/[^0-9]/g, "");

console.log(nonNumericCharacters);  // 출력: "123"
  • [^0-9] : 대괄호 안에 있는 ^는 부정(negation)을 나타내며, 0-9는 0부터 9까지의 모든 숫자를 나타냄. → 숫자 아닌 모든 문자
  • /g : 정규표현식의 전역(g) 플래그는 문자열 내에서 패턴과 일치하는 모든 부분을 찾도록 함.

 

풀이 3

문자열에 스프레드 연산자 적용 후, reduce로 누적합 구하기

function solution(my_string) {
    return [...my_string]
            .reduce((acc, cur) => Number(cur) ? +acc + +cur : acc, 0);
}
  • 문자열에도 스프레드 연산자 적용 가능함.
  • +acc, +cur은 숫자로 강제형변환하여 덧셈하도록 함.
  • Number(cur) ? : current value값이 숫자로 변환하여 숫자가 될 경우 true를 반환함.

reduce로 빼기하는 경우

let myArray = ["10", "5", "2"];

let result = myArray.slice(1).reduce((acc, cur) => {
    // 현재 값을 누적된 값에서 빼기
    return Number(cur) ? acc - +cur : acc;
}, +myArray[0]);

console.log(result);  // 출력: 3

초기값을 배열의 첫번째값으로 지정해주고, 해당 값은 reduce 적용하기 전에 제거해주기(slice)


소인수분해

문제 설명

  • 소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 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]

 

풀이

function solution(n) {
    var answer = [];
    for (i = 2; i <= n; i++) {
        while (n % i == 0) {
            n = Math.floor(n / i);
            answer.push(i)   
        }
    }
    return [...new Set(answer)]
}

마지막으로 Set을 활용하여 중복된 원소를 제거해주어야 함.

모든 값이 정수이므로 Math.floor는 꼭 안 써도 됨.

728x90