Level 0) 수학, 반복문

Doozuu·2023년 1월 6일
0

프로그래머스 (JS)

목록 보기
12/183

📌 문제 1. 주사위의 개수

각 변의 길이에 주사위의 한 변의 길이를 나누어 전부 곱해주면 된다.
ex) box = [10, 8, 6], n=3
// 10 / 3 = 3.xx -> 3
// 8 / 3 = 2.xx -> 2
// 6 / 3 = 2
// 3x2x2 = 12

map을 이용해 풀었다.

function solution(box, n) {
    var answer = 1;
    box.map(len => answer *= parseInt(len / n));
    return answer;
}

reduce를 사용하면 더 깔끔하게 풀 수 있다.

function solution(box, n) {
    return box.reduce((acc,v) => acc * Math.floor(v / n), 1);
}

참고) 구조분해를 이용한 풀이
여기서는 map이나 reduce를 사용하는게 더 좋은 것 같지만 이런식으로 풀 수도 있다.

function solution(box, n) {
    let [width, length, height] = box;

    return Math.floor(width / n) * Math.floor(length / n) * Math.floor(height / n);
}


📌 문제 2. 합성수 찾기

주어진 수보다 작은 수들을 반복문으로 구한 뒤, 소수가 아니면(2부터 자기 자신보다 작은 숫자중에 나누어 떨어지면) 배열에 push 해주었다.
문제는 나누어 떨어질 때마다 push가 되어서 중복이 발생하였다.
따라서 중복을 제거하기 위해 filter를 해주고 갯수를 return 했다.

function solution(n) {
    var answer = [];
    if(n < 4){
        return 0;
    }else{
      for(i=4;i<=n;i++){
        for(j=2;j<i;j++){
          if(i%j === 0){
             answer.push(i); 
          }   
        }
    }
        return answer.filter((element, index) => answer.indexOf(element) === index).length;
    }
}

⭐️ 중복되는 요소 제거하기

1. filter((element, index) => answer.indexOf(element) === index)

filter를 통해 중복되는 요소를 제거
(index가 일치하는 하나만 남기고 중복되는 것을 제거함)

2. Set( )

혹은 Set()을 이용하는 방법도 있다.
Set은 중복되는 값을 허용하지 않는 자료형이기 때문이다.



📌 문제 3. 최댓값 만들기 (1)

가장 큰 2개의 숫자를 구해야 하므로 최댓값을 구하고 최댓값을 제거한 배열에서 가장 큰 숫자를 구하려고 했다.
그러나 고려하지 못한 케이스가 있었다.

function solution(numbers) {
    let max1 = Math.max(...numbers);
    let newArr = numbers.filter(n => n !== max1);
    let max2 = Math.max(...newArr);
    return max1 * max2;
}

⚠️ 고려하지 못한 케이스 : 최댓값이 여러개 있을 때

ex) [1,2,3,4,4]
-> 처음 filter할 때 중복되는 최댓값인 4가 다 없어져서 두 번째로 큰 숫자는 3이 되어버림.


다른 방법 모색

오름차순으로 정리해서 제일 끝에 있는 2개를 곱해보자 (해결!)

function solution(numbers) {    
    let sort = numbers.sort((a,b) => a - b);
    let index = sort.length - 1;
    return sort[index] * sort[index - 1];
}

참고) 내림차순으로 정리하면 마지막 index를 찾지 않아도 되므로 더 깔끔하게 풀 수 있다.

function solution(numbers) {    
    numbers.sort((a,b) => b - a);
    return numbers[0] * numbers[1];
}


📌 문제 4. 팩토리얼 ⭐️

팩토리얼 구하는 함수를 따로 만들어서 for문과 조건문으로 값을 비교하는 코드를 짜다가 너무 길고 값도 이상하게 나와서 더 간단한 방법을 찾아보았다.

function solution(n) {
    let a = 1;
    for(i=1;i<11;i++){
        a *= i;
        if(a === n){
            return i;
        }else if(a > n){
            return i-1;
        }
    }
}

참고) 새로운 방법

function solution(n) {
    let i = 1;
    let f = 1;
    while (f*i < n) f*=++i;
    return i;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글