daily

23.04.19. programmers 코딩테스트 문제 풀기[6]

Juhyuck 2023. 4. 20. 21:04
728x90

최대공약수와 최소공배수 문제

 

문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

제한 사항
두 수는 1이상 1000000이하의 자연수입니다.

입출력 예
n, m, return
3, 12, [3, 12]
2, 5, [1, 10]

최대공약수와 최소공배수를 반환하는 함수이다.

최대공약수는 두 수중에 작은수부터 1씩 감소시키면서 둘다 나누어떨어지는 가장 첫번째 수를 찾는 방식을 택했다.

최소공배수는 두 수를 곱한 값에서 최대공약수를 나눠주면 된다. 그 다음 두 수를 배열로 묶어 반환하는 함수를 만들면 되는 문제. 간단하다.

 

function solution(n, m) {
    // 둘 중 작은 값을 찾고
    let small = m > n ? n : m
    // 최대공약수 변수를 선언한 다음
    let maxCommonDivisor
    // 작은 수 부터 감소시키면서,
    for (let i = small; i >= 1; i--) {
        // 둘다 나눠 나머지가 없는 경우를 찾아서,
        if (m % i === 0 && n % i === 0) {
            // 가장 먼저 나온 값이 최대공약수
            maxCommonDivisor = i
            break
        }
    }
    // 최소공배수는 두 값을 곱한 값에서 최대공약수를 나눠준 값
    leastCommonMultiple = n*m/maxCommonDivisor
    return [maxCommonDivisor, leastCommonMultiple];
}

 

약수의 합 문제도 풀었다.

문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항
n은 0 이상 3000이하인 정수입니다.

입출력 예
n, return
12, 28
5, 6

위 문제와 같이 단순하다. 우선 약수는 자기자신으로부터 시작하니, 먼저 n 값을 넣어두고, 1부터 n/2까지 나머지가 0인 값을 계속 더해주면 된다.

function solution(val) {
    // 입력값을 넣어두고,
    let res = val
    // 입력값/2까지 나머지가 0인 값을 더해준다.
    for (let div = 1; div <= val / 2; div++) {
        if (val % div === 0) {
            res += div
        }
    }
    return res
}