본문 바로가기
코딩테스트-기록

[프로그래머스] 주사위 개수

by SeongwooLee 2024. 1. 27.

 

👉 문제 설명

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

👉 제한사항

  •   box  의 길이는 3입니다.
  •   box[0]   = 상자의 가로 길이
  •   box[1]   = 상자의 세로 길이
  •   box[2]   = 상자의 높이 길이
  • 1 ≤  box  원소 100
  • 1 n ≤ 50
  • 1 ≤  box  의 원소
  • 주사위는 상자와 평행하게 넣습니다.

👉 입출력 예

box n result
[1, 1, 1] 1 1
[10, 8 , 6] 3 12

👉 입출력 예 설명

 

입출력 예 #1

  • 상자의 크기가 가로 1, 세로 1, 높이 1이므로 모서리의 길이가 1인 주사위는 1개 들어갈 수 있습니다.

입출력 예 #2

  • 상자의 크기가 가로 10, 세로 8, 높이 6이므로 모서리의 길이가 3인 주사위는 12개 들어갈 수 있습니다.

👉 내가 푼 풀이

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

👉 다른 사람 풀이 中

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

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

 

| 내가 푼 풀이 해석

| Array.reduce()  메서드 사용 / 누산기가 포함되어 있어, 배열의 각 요소에 대해 함수를 실행하고 누적된 값을 출력할 때 용이

| reduce는 동사로 '줄이다 '라는 뜻 / JS에서는 배열을 돌려서 결국 하나의 값을 반환 (줄여버림)

arr.reduce(callback[, initialValue])

 

 

 callback  : 배열의 각 요소에 대해 실행할 함수로써, 네 가지의 인수를 가짐

1. accumulator : 누산기(acc). 콜백의 반환값을 누적. 콜백의 이전 반환값 or 콜백의 제일 처음 호출이면서 initialValue를 제공한 경우 initialValue 값이다.

2.  currentValue  : 현재 처리할 요소(cur 현재 값)

3.  currentIndex (Optional)  : 현재 처리할 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작함(idx 현재 인덱스)

4.  array (Optional)  : reduce()를 호출한 배열 (src 원본 배열)

 

 initialValue (Optional)  : callback의 처음 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않을 시, 첫 번째 배열의 요소 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류 발생

 

1. reduce메서드를 사용하여 배열 안에 있는 각 요소를 하나로 줄임. result : 줄어들고 있는 값. curr : 배열 안에 있는 각 변의 길이('curr')를 가져와서, 주어진 주사위의 길이(n)로 나눈 몫을 계산 ( 몫: 한 변에 넣을 수 있는 최대 주사위의 개수를 의미)

2. result 에 곱해나가면서, 각 변에 대해 주사위를 최대한으로 채울 수 있는 개수를 계산하고 그 값을 반환


 

| 다른 사람 풀이 나름대로 해석

1. 구조분해 할당으로 시작. 매개변수 box배열의 제한사항 中 길이는 3으로 정해져 있기 때문에, box배열의 요소를 각각 가로, 세로, 높이 변수에 할당해줌 → 각 변의 길이를 개별적으로 다루기 위해서 구조분해 할당

let [width, length, height] = box;

 

 

2. 각 변의 길이를 주어진 주사위길이(n)로 나누고 나눈 그 몫을 계산하고 Math.floor() 소수점이하를 버리고 정수부분만 남겨서 그 값을 곱하여 최종적으로 주사위를 채울 수 있는 최대 개수 구함

 

Ex) 상자(box)의 가로, 세로, 높이 [10, 8 , 6] / 주어진 주사위의 길이(n) 3이라고 가정

  • 가로에는 Math.floor(10 / 3) = 3개의 주사위를 넣을 수 있다.
  • 세로에는 Math.floor(8 / 3) = 2개의 주사위를 넣을 수 있다.
  • 높이에는 Math.floor(6 / 3) = 2개의 주사위를 넣을 수 있다.

각 변에 넣을 수 있는 최대 주사위 개수는 각각 3, 2, 2

이를 모두 곱하면 총 주사위의 개수는 3 * 2 * 2 = 12

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

 


 

 

이렇게 작성하며 이해 되기도 쉽지 않다.

더 다양한 방법풀이도 있지만, 다른이의 풀이를 보면서 배울게 많고 머리를 굴려야겠다 생각했다...!