본문 바로가기

Algorithm

[백준] 5347번 : LCM - C/C++

728x90

두 수의 최소공배수를 출력하는 간단한 문제이다.

1. 테스트 케이스 n 입력 받기

2. a, b 입력 받기

3. 최소공배수 구하기

 

vector를 이용하여 a, b를 입력 받을 것이다.

그럼 헤더를 추가해주어야 한다.

#include <vector>

 

그리고 테스트 케이스와 vector를 통한 a, b 입력 받기

int n;
cin >> n;

vector<pair<int,int>> vec;
int a,b;
    
for(int i = 0; i < n; i++){
	cin >> a >> b;
	vec.push_back(make_pair(a,b));
}

 

완벽하게(?) vector에 값이 들어간다.

 

그리고 이 문제를 해결하는데에 핵심 역할이 되는 함수를 선언해준다.

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

 

위와 같이 최소공배수를 구할 수 있다.

gcd라는 함수를 사용하기 위해서는 헤더를 추가해야한다.

#include <algorithm>

 

헤더를 추가해도 gcd 와 같이 오류가 뜬다.

필자는 macOS에서 c++17 버전을 사용한다.

stackoverflow에 검색해보니 아래와 같은 헤더를 하나 더 추가해야하더라.

#include <numeric>

 

그렇다면 오류선이 사라지게 된다.

 

이제 선언한 함수를 이용해서 최소공배수를 출력해주자.

for (int i = 0; i < n; i++) {
    int a = vec[i].first;
    int b = vec[i].second;
    cout << lcm(a, b) << '\n';
}

 

제출하면

ㅋㅋ

틀렸다.

 

왜 틀렸을까~

 

문제를 잘 읽어보자.

Integer로 선언한 변수가 문제일 것 같았다.

 

int lcm(), int a,b 등 Integer 형태로 선언한 변수를 long long 타입으로 변경해주자.

하 드디어 맞았다.

 

 

 

 

전체 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

//LCM
using namespace std;

typedef long long ll;

ll lcm(ll a, ll b){
    return (a * b) / gcd(a, b);
}

int main(){
    ll n;
    cin >> n;

    vector<pair<int,int>> vec;
    ll a,b;
    
    for(int i = 0; i < n; i++){
        cin >> a >> b;
        vec.push_back(make_pair(a,b));
    }

    for (int i = 0; i < n; i++) {
        ll a = vec[i].first;
        ll b = vec[i].second;
        cout << lcm(a, b) << '\n';
    }
    return 0;
}

 

 

실버5 단계의 문제였다. 코드가 완벽하다고 생각해도 '틀렸습니다'라는 문구를 보면 어떻게 해야하나 라는 생각이 든다.

그래도 이번 문제에서의 오류는 쉽게 찾을 수 있었다. Integer가 아닌 long long 타입으로의 변경.

long long n; 과 같이 선언해도 되는데

귀찮으니까 필자는 typedef 를 통해서 약자를 사용하기로 하였다.

대단한 기술은 아니지만 알고리즘 수업을 들으면서 익혔던 약간의 기술?이다. 하하 !!

필자를 제외하고 알고 있는 사람들이 많은 것 같긴하지만.. 내 자의적으로 이 코드를 사용해본 건 처음? 혹은 오랜만인 것 같다.

문제를 풀고 틀리고, 혼자서 오류를 찾고 맞추니 기분이 참 좋다 ^^

 

 

 

 

 

 

 

 

 

 

더 좋은 풀이가 있다면 댓글로 알려주세요 !!

피드백 환영입니다☺️

728x90