코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (11)

천서리 2023. 5. 26. 18:25
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 11 수학, 반복문

출처 : https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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;
}
  1. 이 코드는 solution이라는 함수를 정의하고 있습니다. 이 함수는 두 개의 매개변수를 받습니다: boxn. box는 세 개의 요소를 가진 배열로, 각 요소는 상자의 가로, 세로, 높이를 나타냅니다. n은 한 변의 길이를 나타내며, 이 값을 이용하여 상자를 nnn 크기의 작은 정육면체로 분할합니다.
  2. 함수 내부에서는 box 배열의 각 요소를 n으로 나눈 몫을 구하고, 그 몫들을 모두 곱한 값을 answer 변수에 할당합니다. 이렇게 함으로써, 각 변의 길이를 n으로 나눈 몫을 기반으로 정육면체로 분할한 작은 상자의 개수를 계산하고 있습니다.
  3. 마지막으로, answer 값을 반환합니다. 이 값은 주어진 boxn으로 나누어 만들 수 있는 작은 정육면체 상자의 개수를 나타냅니다.

예를 들어, box[10, 20, 30]이고 n이 5인 경우, box의 각 요소를 n으로 나눈 몫은 [2, 4, 6]이 되고, 이들을 모두 곱한 결과인 2 * 4 * 6 = 48answer로 반환됩니다. 따라서, 이 경우에는 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;
}
  1. nswer 변수를 0으로 초기화합니다. 그리고 for 반복문을 사용하여 i 변수를 2부터 n까지 1씩 증가시킵니다. 이 for 반복문은 주어진 범위 내에서 각 숫자 i가 합성수인지 판별하고 개수를 세는 역할을 합니다.
  2. 내부에 중첩된 for 반복문은 j 변수를 2부터 i의 제곱근(Math.sqrt(i))까지 1씩 증가시키며 ij로 나누어보고 나머지를 검사합니다. ij로 나누었을 때 나머지가 0이면 ij로 나누어 떨어지므로 합성수입니다. 이 경우 isComposite 변수를 true로 설정하고 내부 for 반복문을 종료합니다.
  3. 내부 for 반복문이 종료되면, isComposite 변수가 true인지 확인하여 isCompositetrue이면 answer를 1 증가시킵니다. 이는 합성수를 발견했을 때마다 개수를 세는 것을 의미합니다.
  4. 외부 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;
}
  1. numbers 배열을 sort 메서드를 사용하여 내림차순으로 정렬합니다. sort 메서드는 배열의 요소를 정렬하는데 사용되며, 비교 함수를 제공할 수 있습니다. 여기서는 비교 함수로 (a, b) => b - a를 사용하였습니다. 이 함수는 ab를 비교하여 b - a의 결과를 반환하는데, 이는 ba보다 큰 경우 양수를, 같은 경우 0을, 작은 경우 음수를 반환하도록 합니다. 따라서, sort 메서드에 의해 배열은 큰 수부터 작은 수 순서로 정렬됩니다.
  2. 정렬된 배열에서 첫 번째 요소(sorted[0])는 가장 큰 수이고, 두 번째 요소(sorted[1])는 그 다음으로 큰 수입니다. 이 두 수를 곱하여 answer 변수에 저장합니다.
  3. 마지막으로, answer 값을 반환합니다. 이 값은 주어진 배열에서 가장 큰 두 수를 곱한 결과를 나타냅니다.

예를 들어, numbers 배열이 [5, 2, 9, 10, 3]인 경우, 정렬된 배열은 [10, 9, 5, 3, 2]가 되고, answer10 * 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;
}
  1. 코드의 실행 흐름을 살펴보면, 초기값으로 i를 1로 설정하고 factorial을 1로 설정합니다.
  2. while 반복문은 factorialn 이하인 동안 계속 반복됩니다. 반복문 내부에서는 i를 1씩 증가시키고, factoriali를 곱하여 factorial 값을 갱신합니다.
  3. factorial은 팩토리얼 값을 나타내므로, 반복문이 종료될 때 factorialn보다 큰 가장 작은 팩토리얼 값이 됩니다. 그러므로 반복문이 종료된 후 in보다 큰 가장 작은 정수가 됩니다.
  4. 마지막으로, i - 1을 반환합니다. 이는 실제로는 factorialn 이하인 가장 큰 팩토리얼 값을 만족하는 i의 값을 구하기 위해 i에서 1을 빼는 것을 의미합니다.

예를 들어, n이 10인 경우, 팩토리얼 값이 10 이하인 가장 큰 정수는 5이므로 함수는 4를 반환합니다.

반응형
Adventure Time - BMO