배꼽파지 않도록 잘 개발해요

[프로그래머스] 입문 Day 2 사칙연산, 조건문, 배열 (Javascript) 본문

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

[프로그래머스] 입문 Day 2 사칙연산, 조건문, 배열 (Javascript)

꼽파 2023. 12. 12. 15:03


두 수의 나눗셈

문제설명 

  • 정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

제한사항 

  • 0 < num1 ≤ 100
  • 0 < num2 ≤ 100

입출력 예시 

num1 num2 result
3 2 1500
7 3 2333
1 16 62

 

풀이 1

Math.floor() 함수

function solution(num1, num2) {
    var answer = Math.floor((num1 / num2) * 1000);
    return answer;
}

 

풀이 2
Math.trunc() 함수

function solution(num1, num2) {
    return Math.trunc(num1 / num2 * 1000);  // 소수점 절삭
}

숫자 비교하기

문제 설명

  • 정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.

제한사항

  • 0 ≤ num1 ≤ 10,000
  • 0 ≤ num2 ≤ 10,000

입출력 예

num1 num2 result
2 3 -1
11 11 1
7 99 -1

 

풀이 1

if - else문 

function solution(num1, num2) {
    if (num1 == num2){
        return 1;
    }
    else{
        return -1;
    }
}

 

풀이 2

삼항연산자

function solution(num1, num2) {
    answer = num1 == num2 ? 1 : -1
    return answer;
}
// 삼항연산자
condition (조건) ? expression1 (참) : expression2 (거짓)

분수의 덧셈

문제 설명

  • 첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예

numer1 denom1 numer2 denom2 result
1 2 3 4 [5, 4]
9 2 1 3 [29. 6]

 

풀이 1

for 반복문으로 분자와 분모의 최대공약수 구하기

function solution(numer1, denom1, numer2, denom2) {
    
    // 일단 통분해서 덧셈한 분수 구하기 → 분모와 분자의 최대공약수로 나눈다
    let den = denom1 * denom2;  // 분모
    let num = numer1 * denom2 + numer2 * denom1;  // 분자
    let gda;  // 최대공약수
    
    // 분모와 분자의 최대공약수 구하기
    for (let i = 1; i <= Math.min(den, num); i++) {
        if ((den % i == 0) && (num % i == 0)) {
            gda = i; 
        } 
    }
    
    // 분자와 분모의 최대공약수로 나눈 분수 출력
    answer = [num/gda, den/gda]
    
    return answer;
}

 

풀이 2

유클리드 호제법으로 최대공약수 찾아서 계산하기

function solution(numer1, denom1, numer2, denom2) {
    
    // 유클리드 호제법을 사용하여 최대공약수(GCD)를 찾는 함수
    const findGCD = (a, b) => (b === 0 ? a : findGCD(b, a % b));

	// 두 분수를 통분하여 더한 분자와 분모 계산
    const den = denom1 * denom2;  // 분모
    const num = numer1 * denom2 + numer2 * denom1;  // 분자
    
    // 분모의 최대공약수를 구함
    const gcd = findGCD(denom1, denom2);
    
    // 최대 공약수로 분모와 분자를 나누어 간단한 형태의 분수로 반환
    return [num / gcd, den / gcd];
}
// 유클리드 호제법으로 최대 공약수 찾기

(b === 0 ? a : findGCD(b, a % b))
// b가 0 : a가 최대공약수이므로 a를 반환
// b가 0이 아니면 : b와 a를 b로 나눈 나머지의 최대 공약수를 찾음

예시)
findGCD(48, 18) ---> a = 48, b = 18
findGCD(18, 12) ---> a = 18, b = 12
findGCD(12, 6) ---> a = 12, b = 6
findGCD(6, 0) ---> a = 6, b = 0

b === 0 이므로 a를 반환
최대공약수는 6이 됨.

 

주의할 점

  • 이 문제는 수학적인 내용을 어느 정도 숙지하고 있어야 풀 수 있는 문제였다. 그래서 레벨 0 문제 중에서도 정답률이 낮다.
  • 두 번째 풀이 같은 경우에는 재귀 호출에 대해 알고 있어야 풀 수 있다. 

배열 두 배 만들기

문제 설명

  • 정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 1 ≤ numbers의 길이 ≤ 1,000

입출력 예

numbers result
[1, 2, 3, 4, 5] [2, 4, 6, 8, 10]
[1, 2, 100, -99, 1, 2, 3]  [2, 4, 200, -198, 2, 4, 6]


풀이 1

배열을 생성해서 입력값에 두 배를 하여 원소를 추가

function solution(numbers) {
    var answer = [];  // 배열 생성
    for (i = 0; i < numbers.length; i++) {
        answer.push(numbers[i] * 2)  // 입력받은 값에 두 배를 하여 원소 추가
    }
    return answer;
}

 

풀이 2

reduce 함수 활용

function solution(numbers) {
    return numbers.reduce( (a, b) => [...a, b * 2], [])
}

 

reduce 함수
· 배열의 각 요소에 대해 주어진 콜백함수 실행, 그 결과를 누적하여 최종 결과를 반환하는 고차함수
· 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback 함수를 한 번씩 실행

arr.reduce(callback[, initialValue])

  • (a, b) => [...a, b * 2] : a에 b를 2배한 값이 누적한 새로운 배열을 반환함
  • a : accumulator, 누적 값
  • b : currentValue, 현재 요소
  • [] : reduce 함수의 초기값  (초기값 입력하면 초기값 다음의 인덱스부터 값이 들어옴)

 

reduce 함수를 활용한 배열의 원소 변형

const numbers = [1, 2, 3, 4, 5];

const result = numbers.reduce((accumulator, currentElement) => {
  // ...accumulator는 이전까지 누적된 배열을 전개
  // currentElement * 2는 현재 요소를 3배로 만든 값에 1 추가
  return [...accumulator, currentElement * 3 + 1];
}, []);

console.log(result);

 

초기값을 지정해주지 않으면 배열이 발생함.

초기값을 빈 배열로 설정하면 항상 배열이 반환됨.

const numbers = [1, 2, 3, 4]

const result1 = numbers.reduce((a, b) => [...a, b * 2]);
console.log(result1) // TypeError: a is not iterable

const result2 = numbers.reduce((a, b) => [...a, b * 2], []);
console.log(result2) // [2, 4, 6, 8]

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org

 

주의할 점

  • reduce 함수를 제대로 공부해보지 않아서 두 번째 풀이는 어려웠다.
  • 문제 풀이보다 자바스크립트에 대해 모르고 있는게 더 많은 것 같아서, 모던 자바스크립트 공부부터 제대로 해야겠다는 생각이 든다.
728x90