Q. 머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.
function solution(box, n) {
return Math.floor(box[0] / n) * Math.floor(box[1] / n) * Math.floor(box[2] / n);
}
- 1단계. 본 문제는 단순히 상자와 주사위의 부피를 나누는 것만으로는 풀 수 없고, 상자의 가로, 세로, 높이를 주사위의 가로, 세로, 높이와 비교해야 한다는 것을 파악한다.
- 2단계. 상자의 각각의 길이를 주사위의 모서리 길이로 나누어 소숫점을 버린 정수부분끼리 곱하여 답을 구한다.
Q. 약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(n) {
var answer = 0;
let item = [];
for (let i = n; i >= 3; i--){
for (let j = i; j >= 1; j--){
if (i % j === 0) {
item.push(j);
}
}
if (item.length >= 3) {
answer += 1;
item = [];
}
}
return answer;
}
- 합성수는 약수가 3개이상인 수를 의미하기에, 빈 배열을 만들어서 약수들을 그 배열에 집어넣고 , 배열의 길이가 3 이상일때, 정답에 1씩 더해주기로 계획한다.
- n 이하의 수를 전부 돌아야 하기에, 반복문을 작성하고, 그 안에서 약수가 3개인 수를 찾아야 하기에 약수를 구하는 반복문을 하나 더 작성한다.
- 여기서 주의할 점은 첫번째 반복문
for (let i = n; i >= 3; i--){}
에서 범위가i >=2
이면 오류가 생긴다. 그러므로 i의 범위는 3으로 지정해야한다.- 약수의 개수가 3개 이상인 배열이 생기면 정답에 1씩 더하고, 약수를 집어 넣었던 배열은 다시 초기화 시켜, 다음 수로 넘어간다.
function solution(n) {
let answer = 0;
for (let i = n; i>= 1; i--){
let isCount = false;
for (let num = 2; num <= i-1; num++){
if (i % num === 0) {
isCount = true;
}
}
if (isCount) {
answer += 1;
}
}
return answer;
}
- 주인장의 풀이와 다르게, 배열을 따로 만들지 않고, 합성수 진위 판단으로 가볍고 오류없이 만들었음
- 1단계. 약수는 기본적으로 본인과 1은 반드시 포함하기에, 둘 이외의 약수가 존재하면 합성수라는 메커니즘을 갖고 출발한다.
- 2단계. 참 거짓을 판단할 변수를 만들고, 이를 가지고 또다른 약수의 유무에 대한 참거짓을 판별한다.
- 3단계. 참거짓 반복문 겉에 n이하의 수를 돌아주는 반복문까지 작성하고, 마무리로 조건문을 사용하여 정답에 1씩 더해준다.