JavaScript/알고리즘

프로그래머스 주사위의 개수 JS

hihiha2 2023. 6. 30. 05:50

문제 설명

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

 

 

 

🙋‍♀️ 내 생각

제일먼저 상자의 가로 길이를 생각했다.

가로의 길이에 몇개가 들어갈지를 먼저 생각한 뒤, 세로의 길이가 몇개 들어갈 수 있는지 마지막으로 높이에 따라 몇개가 들어갈지를 생각했다.

 

상자와 주사위가 평면적이지 않기때문에 머릿속에서 상자를 상상하면서 문제를 풀었는데, 상상한 내용을 설명하기 위해서 아래에 사진을 준비해보았다.

 

가로의 길이가 10이라면, 길이가 3인 주사위는 가로폭으로는 3개 들어갈 수 있다 (10/3)

    🎲      🎲      🎲

➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️➡️

 

그 다음으로 세로를 생각한다.

세로가 8이라면, 길이가 3인 주사위는 2개가 들어갈 것이다. (8/3)

 

그런데 상자는 입체적이다. 따라서 가로에 3개가 들어가고 세로로 2개가 들어간다면 3*2개 즉, 총 6개가 들어간다.

 

 

 

 

마지막으로 높이를 생각한다.

높이가 6이라면 길이가 3인 주사위는 2개 들어간다. (6/2)

즉, 높이가 2단이라는 이야기이다. 

 

그러면 상자에 들어가는 주사위의 총개수는 6*2 = 12개이다.

 

머릿속에서 상상하면서 문제를 풀었고, 쉽게 이해하기 위해 입출력예2를 기준으로 생각했다. 

 

 

 

✅ 내 코드

function solution(box, n) {
    return parseInt(box[0]/n) * parseInt(box[1]/n) * parseInt (box[2]/n)
}

위에서 생각한 내용을 토대로 그대로 자바스크립트 언어로 옮겨서 풀면 된다.

box라는 배열에 들어있는 값들이 각각 상자의 가로,세로,높이를 나타내므로 이 값들을 주사위의 길이(n)로 나누고 곱하면 된다.

이때 parseInt()를 통해서 값을 정수로 만들어주었다.

Math.floor()나 Math.trunc()와 같은 메서드도 생각했는데 parseInt()도 pass가 되어서 그냥 풀었다.

 

 

 

 

💻  다른사람 코드중에 배울 것 

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

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

}

구하는 방식은 값지만, parseInt()대신에 Math.floor를 사용하였다.

 

이 코드에서 배울 점이라고 생각한것은 배열의 구조분해할당을 통해서 width,length,height라는 변수명을 지어줌으로써 코드의 가독성이 올라간 점이다. let [witdh, length, height] = box 

 

 

 

💻  다른사람 코드중에 배울 것 2

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

box를 reduce를 통해서 돌면서 각각의 요소들을 Math.floor하면서 곱해주었다.

곱하는 값이 많이 않아서 딱히 reduce를 떠올리지는 않았었는데, 나중에 값이 많아지면 이런식으로 풀어도 좋을것같다.

 

 

 

🙋‍♀️ 내 생각

이 문제는 어떤 방식으로 푸는지보다, 상자안에 들어갈 주사위를 머릿속으로 몇개가 들어갈지 생각해내는 것이 중요한 문제인 것 같다.

생각만해내면 자바스크립트 코드로 옮기는 것은 어렵지 않다.