👉 문제 설명
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다.
상자의 가로, 세로, 높이가 저장되어있는 배열 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);
이렇게 작성하며 이해 되기도 쉽지 않다.
더 다양한 방법풀이도 있지만, 다른이의 풀이를 보면서 배울게 많고 머리를 굴려야겠다 생각했다...!
'코딩테스트-기록' 카테고리의 다른 글
[프로그래머스] JS - 369게임 (0) | 2024.04.30 |
---|---|
[프로그래머스] JS - 모음 제거 (0) | 2024.04.25 |
[프로그래머스] 자바스트립트 배열 값 추가, 제거 pop(), push(), shift(), unshift() 함수 (0) | 2024.01.24 |
[프로그래머스] 중복값 개수 구하기 (0) | 2024.01.09 |