문제 링크 : 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 |