프로그래머스

프로그래머스 18일차

ture403 2023. 6. 3. 21:19

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

소인수분해

문제

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

 

정답풀이

function solution(n) {
  let result = [];
  let divisor = 2;
  
  while (n >= 2) {
    if (n % divisor === 0) {
      result.push(divisor)
      n = n / divisor;
    }
    
     else divisor ++;
    
  }
  
  return [...new Set(result)];
}

초기화 부분에서는 빈 배열 result와 나누는 수인 divisor를 2로 설정합니다.
while 루프는 n이 2 이상인 동안 계속 실행됩니다.
if 문에서는 현재 n이 divisor로 나누어 떨어지는지 확인합니다. 나누어 떨어진다면 divisor는 n의 소인수이므로 result 배열에 추가하고, n을 divisor로 나눕니다.
else 문에서는 divisor를 1씩 증가시킵니다. 이는 소인수를 찾기 위해 나누는 수를 변경하는 과정입니다.
n이 2보다 작아지면 while 루프가 종료됩니다.
return 문에서는 중복된 값을 제거하기 위해 result 배열을 Set 객체로 변환한 후 다시 배열로 변환하여 반환합니다.

컨트롤 제트

문제

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

문제풀이

function solution(s) {
    s = s.split(' ');
    let arr = [];
    for (let v of s) v === 'Z' ? arr.length ? arr.pop() : '' : arr.push(v);
    return arr.reduce((a,v)=>a+ +v,0);
}

 

문자열 s를 공백을 기준으로 분할하여 배열로 변환합니다. (s.split(' '))
빈 배열 arr을 초기화합니다.
for...of 루프를 사용하여 배열 s의 각 요소를 반복합니다.
현재 요소 v가 'Z'인지 확인합니다. 만약 'Z'라면 아래 동작을 수행합니다.
a. arr.length를 확인하여 배열 arr이 비어있지 않은지 확인합니다.
b. 비어있지 않다면 arr.pop()을 통해 마지막 요소를 배열에서 제거합니다.
c. 비어있다면 아무 동작도 수행하지 않습니다.
'Z'가 아닌 경우, 현재 요소 v를 배열 arr에 추가합니다. (arr.push(v))
arr.reduce((a, v) => a + +v, 0)를 사용하여 배열 arr의 각 요소를 숫자로 변환하여 합계를 계산합니다. (+v를 통해 문자열을 숫자로 변환합니다.)
최종적으로 합계를 반환합니다.

영어가 싫어요

문제

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.


정답풀이

function solution(numbers) {
    let numStr = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" ];

    numStr.forEach((str, idx) => {
        numbers = numbers.replaceAll(str, idx);
    });
    return Number(numbers);
}

numStr이라는 배열을 선언하고, 0부터 9까지의 영어 표현을 원소로 가지고 있습니다.

numStr.forEach()를 사용하여 numStr 배열의 각 요소와 해당 인덱스 값을 매개변수로 받는 콜백 함수를 실행합니다.

콜백 함수 내에서는 문자열 numbers의 모든 요소를 순회하며, 각 요소가 numStr 배열의 원소와 일치하는지 확인합니다.

일치하는 요소를 찾았을 경우, 해당 요소를 인덱스 값으로 바꿉니다. 이를 위해 numbers.replaceAll() 함수를 사용합니다. replaceAll() 함수는 문자열 내의 모든 해당 문자열을 대체하는 역할을 합니다.

마지막으로, 변환된 문자열 numbers를 숫자로 변환하기 위해 Number() 함수를 사용하여 숫자로 변환한 후 반환합니다.