Javascript/문제 풀이

프로그래머스 16일차

아라라_ 2023. 6. 2. 01:14

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

Frederick Philips Brooks
Mythical Man-Month 저자
728x90

주사위의 개수

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

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

box.reduce 메서드를 사용하여 box 배열의 모든 요소를 하나씩 순회하면서 처리합니다. reduce 메서드는 배열의 각 요소에 대해 주어진 콜백 함수를 실행하고, 이전 값과 현재 값의 결합을 통해 최종 결과를 반환합니다. 주어진 콜백 함수는 (acc, cur) => acc * Math.floor(cur / n)로 정의되어 있습니다. 이 콜백 함수는 누적값 acc와 현재 값 cur을 곱한 결과를 반환합니다. Math.floor(cur / n)을 통해 현재 상자의 한 변의 길이인 cur을 주사위 모서리의 길이 n으로 나눈 뒤 내림하여 정수값으로 변환합니다. 이는 한 변에 들어갈 수 있는 주사위의 최대 개수를 구하는 과정입니다. 각 상자의 변마다 들어갈 수 있는 최대 주사위 개수를 구하고, reduce 메서드를 통해 이를 모두 곱하여 최종적인 결과를 얻습니다. 예를 들어, 주어진 box 배열이 [6, 8, 12]이고 주사위 모서리의 길이인 n이 2일 경우, 첫 번째 상자의 변의 길이 6을 2로 나눈 값은 3이 되고, 두 번째 상자의 변의 길이 8을 2로 나눈 값은 4가 되며, 세 번째 상자의 변의 길이 12를 2로 나눈 값은 6이 됩니다. 따라서 최종적으로 주사위의 최대 개수는 3 * 4 * 6 = 72개가 됩니다. 이 값이 solution 함수의 반환 값으로 출력됩니다.

 

 

합성수 찾기

문제 설명 약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

function solution(n) {
    var answer = 0
    
    for(let i = 1; i <= n; i++) {
        let cnt = 0
        for(j = 0; j <= i; j++) {
            if(i % j === 0) cnt ++
        }
        
        if(cnt > 2) {
            answer += 1
        }
    }
    
    return answer
}

answer 변수를 0으로 초기화합니다. 이 변수는 합성수의 개수를 저장하는 변수입니다. 그리고 1부터 n까지의 모든 자연수에 대해 반복문을 실행합니다. 이 반복문은 각 숫자가 합성수인지 확인하기 위한 목적으로 사용됩니다. 반복문 내부에서 cnt 변수를 0으로 초기화합니다. 이 변수는 현재 숫자의 약수의 개수를 저장하는 변수입니다. 그리고 내부 반복문에서는 0부터 현재 숫자 i까지의 모든 숫자에 대해 반복합니다. 이 반복문은 i의 약수의 개수를 세는 역할을 합니다. 내부 반복문에서는 현재 숫자 i를 반복 변수인 j로 나누어서 나머지가 0인지 확인합니다. 만약 나머지가 0이라면 i는 j의 약수이므로 cnt 값을 1 증가시킵니다. 내부 반복문이 종료된 후에는 cnt 변수의 값이 i의 약수의 개수가 됩니다. 이후, cnt 값이 2보다 큰 경우에는 answer 값을 1 증가시킵니다. 이는 i가 합성수라는 의미입니다. 모든 반복이 완료되면 최종적으로 answer 값을 반환합니다. 이 값은 주어진 n 이하의 합성수의 개수를 나타냅니다. 하지만 주어진 코드에는 몇 가지 문제가 있습니다. 내부 반복문에서 j의 초기값이 0으로 설정되어 있어서 i가 0일 때 0으로 나누는 오류가 발생할 수 있습니다. 또한, 반복문의 범위가 j <= i로 설정되어 있어서 j가 i와 같을 때도 불필요하게 약수로 카운트됩니다. 이러한 오류를 수정해야 합니다.