[프로그래머스]C++ LV1 최대공약수와 최소공배수

2025. 2. 3. 01:42·코딩테스트/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1.문제 설명

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

 

제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

n m return
3 12 [3,12]
2 5 [1,10]

 

입출력 예 설명

입출력 예 #1
위의 설명과 같습니다.

 

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

 

2.문제풀이

  • 최대공약수와 최소공배수를 구하는 함수를 작성한다.
  • 작성한 함수를 이용해 answer벡터에 첫 번째 원소에는 최대공약수를 두번째 원소에는 최소공배수를 넣는다.

먼저 최대공약수와 최소공배수의 의미부터 살펴 보도록 하자.

최대공약수 : 두 수의 공약수 중 가장 큰 수를 의미한다.

- 예를 들어 20과 30의 최대 공약수를 구하고자 한다. 

20의 약수는 1,2,4,5,10,20이고 30의 약수는 1,2,3,5,6,10,15,30이다.

두수의 공약수(두 수의 공통된 약수)는 1,2,5,10이고 이중 가장 큰 수인 10이 최대공약수가 된다!!

 

최소공배수 : 두 수의 공배수 중 가장 작은 수를 의미한다.

-예를 들어 20과 30의 최소 공배수를 구하고자 한다.

20의 배수는 20, 40, 60, 80· · · · 이고  30의 배수는 30, 60, 90· · · ·이다

두수의 공배수(두 수의 공통된 배수) 중 가장 작은 수인 60이 최소공배수가 된다!!

  

  • 최대공약수 구하기

최대공약수를 구하는 대표적인 알고리즘 유클리드 호제법을 사용한다. 유클리드 호제법은 정수 a와 b가 있을 때 큰 숫자에서 작은 숫자로 나눈 나머지를 구한다. a를 작은 수인 b로 바꾸고, b는 나머지 숫자로 바꾼다. 그렇게 a자리에 오게 된 작은수와 b자리에 오게된 나머지 숫자를 나누는 이 과정을 반복하면서 나머지 숫자가 0이 될 때까지 반복하도록 한다. 수학적인 공식으로는 GCD(a,b)=GCD(b,a mod b)라고 한다.

 

  • 최소공배수 구하기

최대공약수를 구했다면 최소공배수를 구하는 것은 비교적 간단하다. 두 수를 곱한 다음 최대공약수로 나눠주기만 하면 된다.

 

3.소스코드

#include <string>
#include <vector>

using namespace std;

int gcd(int a, int b)
{
    int temp;
    while(b != 0)
    {
        temp = a % b;
        a = b;
        b = temp;
    }
    
    return a;
}

int lcm(int a,int b)
{
    int c = (a * b) / gcd(a,b);
    return c;
}

vector<int> solution(int n, int m) {
    vector<int> answer;
    
    answer.push_back(gcd(n,m));
    answer.push_back(lcm(n,m));
    
    return answer;
}

 

4.다른 풀이

C++17부턴 gcd,lcm함수를 지원한다.이 함수들은 <numeric> 헤더에 포함되어 있다. 

#include <string>
#include <vector>
#include <numeric>

using namespace std;

vector<int> solution(int n, int m) {
    vector<int> answer;
    
    answer.push_back(gcd(n,m));
    answer.push_back(lcm(n,m));
    
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[프로그래머스]C++ LV1 소수 찾기  (1) 2025.04.11
[프로그래머스]C++ LV1 [1차]다트게임  (1) 2025.04.10
[프로그래머스]C++ LV1 3진법 뒤집기  (1) 2025.02.11
[프로그래머스] C++ LV1 같은 숫자는 싫어  (1) 2025.01.09
[프로그래머스] C++ LV0 5명씩  (2) 2025.01.08
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스]C++ LV1 [1차]다트게임
  • [프로그래머스]C++ LV1 3진법 뒤집기
  • [프로그래머스] C++ LV1 같은 숫자는 싫어
  • [프로그래머스] C++ LV0 5명씩
charleskim
charleskim
charleskim 님의 블로그 입니다.
  • charleskim
    charles의 개발 일기
    charleskim
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • C++ (2)
      • 자료구조와 알고리즘 (0)
        • 자료구조 (0)
        • 알고리즘 (0)
      • 코딩테스트 (7)
        • 프로그래머스 (7)
        • 백준 (0)
      • UnrealEngine (0)
      • 프로젝트 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    프로그래머스
    코딩테스트
  • hELLO· Designed By정상우.
charleskim
[프로그래머스]C++ LV1 최대공약수와 최소공배수
상단으로

티스토리툴바