“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
코딩테스트 입문 Day 11 수학, 반복문
출처 : https://programmers.co.kr/
주사위의 개수
문제
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- box의 길이는 3입니다.
- box[0] = 상자의 가로 길이
- box[1] = 상자의 세로 길이
- box[2] = 상자의 높이 길이
- 1 ≤ box의 원소 ≤ 100
- 1 ≤ n ≤ 50
- n ≤ 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개 들어갈 수 있습니다.
solution.js
function solution(box, n) {
var answer = Math.floor(box[0] / n) * Math.floor(box[1] / n) * Math.floor(box[2] / n);
return answer;
}
- 이 코드는 solution이라는 함수를 정의하고 있습니다. 이 함수는 두 개의 매개변수를 받습니다: box와 n. box는 세 개의 요소를 가진 배열로, 각 요소는 상자의 가로, 세로, 높이를 나타냅니다. n은 한 변의 길이를 나타내며, 이 값을 이용하여 상자를 nnn 크기의 작은 정육면체로 분할합니다.
- 함수 내부에서는 box 배열의 각 요소를 n으로 나눈 몫을 구하고, 그 몫들을 모두 곱한 값을 answer 변수에 할당합니다. 이렇게 함으로써, 각 변의 길이를 n으로 나눈 몫을 기반으로 정육면체로 분할한 작은 상자의 개수를 계산하고 있습니다.
- 마지막으로, answer 값을 반환합니다. 이 값은 주어진 box를 n으로 나누어 만들 수 있는 작은 정육면체 상자의 개수를 나타냅니다.
예를 들어, box가 [10, 20, 30]이고 n이 5인 경우, box의 각 요소를 n으로 나눈 몫은 [2, 4, 6]이 되고, 이들을 모두 곱한 결과인 2 * 4 * 6 = 48이 answer로 반환됩니다. 따라서, 이 경우에는 box를 5x5x5 크기의 작은 정육면체 상자로 분할하여 48개의 작은 상자가 만들어집니다.
합성수 찾기
문제
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 100
입출력 예
n | result |
10 | 5 |
15 | 8 |
입출력 예 설명
입출력 예 #1
- 10 이하 합성수는 4, 6, 8, 9, 10 로 5개입니다. 따라서 5를 return합니다.
입출력 예 #2
- 15 이하 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개입니다. 따라서 8을 return합니다.
solution.js
function solution(n) {
var answer = 0;
for (var i = 2; i <= n; i++) {
var isComposite = false;
for (var j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) {
isComposite = true;
break;
}
}
if (isComposite) {
answer++;
}
}
return answer;
}
- nswer 변수를 0으로 초기화합니다. 그리고 for 반복문을 사용하여 i 변수를 2부터 n까지 1씩 증가시킵니다. 이 for 반복문은 주어진 범위 내에서 각 숫자 i가 합성수인지 판별하고 개수를 세는 역할을 합니다.
- 내부에 중첩된 for 반복문은 j 변수를 2부터 i의 제곱근(Math.sqrt(i))까지 1씩 증가시키며 i를 j로 나누어보고 나머지를 검사합니다. i를 j로 나누었을 때 나머지가 0이면 i는 j로 나누어 떨어지므로 합성수입니다. 이 경우 isComposite 변수를 true로 설정하고 내부 for 반복문을 종료합니다.
- 내부 for 반복문이 종료되면, isComposite 변수가 true인지 확인하여 isComposite가 true이면 answer를 1 증가시킵니다. 이는 합성수를 발견했을 때마다 개수를 세는 것을 의미합니다.
- 외부 for 반복문이 모두 실행되고 나면, answer 변수에는 주어진 범위 내의 합성수의 개수가 저장되어 있습니다. 이 값을 return하여 반환합니다.
예를 들어, n이 10인 경우, 10 이하의 합성수는 4개(4, 6, 8, 9)이므로 함수는 4를 반환합니다.
최댓값 만들기 (1)
문제
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ numbers의 원소 ≤ 10,000
- 2 ≤ numbers의 길이 ≤ 100
입출력 예
numbers | result |
[1, 2, 3, 4, 5] | 20 |
[0, 31, 24, 10, 1, 9] | 744 |
입출력 예 설명
입출력 예 #1
- 두 수의 곱중 최댓값은 4 * 5 = 20 입니다.
입출력 예 #2
- 두 수의 곱중 최댓값은 31 * 24 = 744 입니다.
solution.js
function solution(numbers) {
var sorted = numbers.sort((a, b) => b - a);
var answer = sorted[0] * sorted[1];
return answer;
}
- numbers 배열을 sort 메서드를 사용하여 내림차순으로 정렬합니다. sort 메서드는 배열의 요소를 정렬하는데 사용되며, 비교 함수를 제공할 수 있습니다. 여기서는 비교 함수로 (a, b) => b - a를 사용하였습니다. 이 함수는 a와 b를 비교하여 b - a의 결과를 반환하는데, 이는 b가 a보다 큰 경우 양수를, 같은 경우 0을, 작은 경우 음수를 반환하도록 합니다. 따라서, sort 메서드에 의해 배열은 큰 수부터 작은 수 순서로 정렬됩니다.
- 정렬된 배열에서 첫 번째 요소(sorted[0])는 가장 큰 수이고, 두 번째 요소(sorted[1])는 그 다음으로 큰 수입니다. 이 두 수를 곱하여 answer 변수에 저장합니다.
- 마지막으로, answer 값을 반환합니다. 이 값은 주어진 배열에서 가장 큰 두 수를 곱한 결과를 나타냅니다.
예를 들어, numbers 배열이 [5, 2, 9, 10, 3]인 경우, 정렬된 배열은 [10, 9, 5, 3, 2]가 되고, answer는 10 * 9 = 90이 됩니다. 따라서, 이 함수는 90을 반환합니다.
팩토리얼
문제
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
- i! ≤ n
제한사항
- 0 < n ≤ 3,628,800
입출력 예
numbers | result |
3628800 | 10 |
7 | 3 |
입출력 예 설명
입출력 예 #1
- 10! = 3,628,800입니다. n이 3628800이므로 최대 팩토리얼인 10을 return 합니다.
입출력 예 #2
- 3! = 6, 4! = 24입니다. n이 7이므로, 7 이하의 최대 팩토리얼인 3을 return 합니다.
solution.js
function solution(n) {
var i = 1;
var factorial = 1;
while (factorial <= n) {
i++;
factorial *= i;
}
return i - 1;
}
- 코드의 실행 흐름을 살펴보면, 초기값으로 i를 1로 설정하고 factorial을 1로 설정합니다.
- while 반복문은 factorial이 n 이하인 동안 계속 반복됩니다. 반복문 내부에서는 i를 1씩 증가시키고, factorial에 i를 곱하여 factorial 값을 갱신합니다.
- factorial은 팩토리얼 값을 나타내므로, 반복문이 종료될 때 factorial은 n보다 큰 가장 작은 팩토리얼 값이 됩니다. 그러므로 반복문이 종료된 후 i는 n보다 큰 가장 작은 정수가 됩니다.
- 마지막으로, i - 1을 반환합니다. 이는 실제로는 factorial이 n 이하인 가장 큰 팩토리얼 값을 만족하는 i의 값을 구하기 위해 i에서 1을 빼는 것을 의미합니다.
예를 들어, n이 10인 경우, 팩토리얼 값이 10 이하인 가장 큰 정수는 5이므로 함수는 4를 반환합니다.