알고리즘

[백준] BOJ 1037번 약수

staktree 2022. 3. 9. 01:10

문제 링크 : https://www.acmicpc.net/problem/1037

 

1037번: 약수

첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되

www.acmicpc.net

문제 : 

양수 A가 N의 진짜 약수가 되려면, N이 A의 배수이고, A가 1과 N이 아니어야 한다. 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램을 작성하시오.

 

접근 :

 1과 N을 제외한 N의약수들이 주어질 때 N을 구하는 문제이다. 예를 들어, N이 24이라면 1과 24를 제외한 2, 3, 4, 6, 8, 12가 임의의 순서로 주어진다.  약수 중 가장 큰 값으로 N을 나누면 약수 중 가장 작은 값이 나오기 때문에, 주어진 약수중 가장 작은 값과 큰 값을 곱하면 N을 구할 수 있다. 

 

해결 : 

가장 작은 값과 가장 큰 값을 곱하면 된다. 가장 작은 값과 가장 큰 값을 구하기 위하여 반복문을 사용하여도 괜찮지만, vector와 algorithm 라이브러리에 익숙해기 위해서 vector에 입력을 받아 정렬하였다. 정렬된 값의 첫 번째 값(가장 작은 값)과 마지막 값(가장 큰 값)을 곱하면 정답을 구할 수 있다. 

 

소스코드 : 

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int N;
vector <int> realDivisor;

int main()
{
    cin >> N;
    for(int i = 0; i < N; i++)
    {
        int temp;
        cin >> temp;
        realDivisor.push_back(temp); 
    }
    sort(realDivisor.begin(), realDivisor.end());

    cout << realDivisor.front() * realDivisor.back() << endl;
    return 0;
}

 

라이브러리 정리 : 

algorithm 헤더파일을 추가하여 sort 함수를 사용한다.

vector.begin() : 벡터의 맨 처음 주소값

vector.end() : 벡터의 마지막 주소값

vector.front() : 벡터의 맨 처음 값

vector.back() : 벡터의 마지막 값

vector.erase(지우고 싶은 주소) : 해당 주소의 값을 삭제

 

'알고리즘' 카테고리의 다른 글

[프로그래머스]소수 찾기(C++)  (2) 2023.12.02
[백준] BOJ 7579번 앱  (0) 2023.11.29
[백준] BOJ 10830번 행렬 제곱  (2) 2023.11.27
[백준] BOJ 14501번 퇴사  (0) 2022.04.05
[백준] BOJ 13305번 주유소  (0) 2022.03.15