기초부터 시작하는 코딩/Programmers

Programmers 문제를 풀어봅시다. Day14

kebab00 2023. 5. 31. 22:04

728x90

1. 주사위의 개수

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

- 정답은 

function solution(box, n) {
    let answer = 0;
    let box_W = box[0]
    let box_D = box[1]
    let box_H = box[2]
    let dice = n
    let dice_W = Math.floor(box_W / n);
    let dice_D = Math.floor(box_D / n);
    let dice_H = Math.floor(box_H / n);
    answer = dice_W * dice_D * dice_H
    return answer;
}

1. 일단 공식을 생각해 보았습니다. 한변에 주사위가 몇개씩 들어갈 수 있는지 계산 한 다음에  다 곱해주면 구할 수 있습니다.

2. 하지만 정수로 구해야 함으로 Math.floor를 사용해 소수점 이하는 버림해주었습니다.

3. 각 변에 들어가는 주사위의 갯수는 변의 길이 / 주사위 변의 길이 입니다. 주사위는 정육면체 이므로 그냥 n으로 해주면 됩니다.

4. 그리고 다 곱해주면 끝 !

2. 합성수 찾기

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

- 정답은

function solution(n) {
  let num = [];
  let count = 0;

  for (let i = 2; i <= n; i++) {
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) {
        num.push(i);
      }
    }
    if (num.filter(function (x) { return x === i; }).length >= 3) {
      count++;
    }
  }
  return count;
}
  1. let num = [];는 빈 배열 num을 초기화합니다.
  2. let count = 0;는 변수 count를 0으로 초기화합니다. 이 변수는 세 개 이상의 약수를 갖는 수의 개수를 세기 위해 사용됩니다.
  3. for (let i = 2; i <= n; i++)은 2부터 n까지의 수에 대해 반복합니다.
  4. 내부에 있는 for (let j = 1; j <= i; j++)은 i까지의 수에 대해 반복합니다. 이 반복문은 i를 j로 나누어 나머지가 0인 경우를 찾아내어 num 배열에 i를 추가합니다.
  5. if (num.filter(function (x) { return x === i; }).length >= 3)은 num 배열에서 i와 같은 수의 개수가 3 이상인 경우를 확인합니다. filter 함수를 사용하여 num 배열에서 i와 같은 수만 남기고, 그 개수를 세어서 3 이상인지 확인합니다.
  6. 조건을 만족하는 경우, count 변수를 증가시킵니다.
  7. 모든 반복이 완료된 후, count 값을 반환합니다.

이렇게 변환한 자바스크립트 코드는 주어진 범위 내에서 약수의 개수를 세는 방식으로 동작합니다. 반환된 count 값은 적어도 개의 약수를 갖는 수의 개수를 나타냅니다.

3.팩토리얼

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요

조건 : i! ≤ n

- 정답은

function solution(n) {
    let result = 0
    for(let i = 1 ; i <= 10; i++) {
        if(n >= getFacto(i)) {
            result = i
            continue
        } else {
            break
        }
    }
    return result
}
function getFacto(num) {
    if(num > 1) return num*getFacto(num-1)
    return num
}

함수 getFacto(num)은 재귀적인 방식을 사용하여 주어진 숫자 num의 팩토리얼 값을 계산합니다. num이 1보다 큰 경우에는 num에 getFacto(num-1)을 곱한 값을 반환하고, 그렇지 않은 경우에는 num 자체를 반환합니다.

함수 solution(n)은 1부터 10까지의 숫자 범위에서 getFacto(i)의 값을 확인하면서, n보다 작거나 같은 가장 큰 팩토리얼 값을 찾습니다. 이를 위해 result 변수를 0으로 초기화하고, i를 1부터 10까지 반복하면서 다음을 수행합니다:

  1. n이 getFacto(i)보다 크거나 같은 경우: result 변수를 i로 업데이트하고 반복문을 계속 진행합니다.
  2. n이 getFacto(i)보다 작은 경우: 반복문을 종료하고 결과인 result 값을 반환합니다.

결과적으로, 함수 solution(n) 입력된 숫자 n 대해 팩토리얼 값을 계산하여, n보다 작거나 같은 가장 팩토리얼 값을 반환합니다.