문제
풀이
혹시 아무리 생각해도 자신의 아이디어가 맞는 것 같은데 틀리게 나온다면 문제를 다시 한번 잘 보자. 이 문제에서 주는 데이터는 약수가 크기 순으로 정렬 된다는 보장이 없다! 즉 8의 약수에 대한 데이터가 아래와 같이 주어질 수 도 있다는 것이다. 따라서 입력을 저장한 다음에 저장한 배열을 정렬해주던가 해야한다.
2
4 2
그 다음부터는 아마 여러분이 생각한대로 일텐데, 어떤 수는 기본적으로 가장 작은 약수 * 가장 큰 약수로 구할 수 있다. 혹시 이 내용을 모르고 있다면 아마 고등학교때 배운 수학 내용을 잊어버린 것일텐데, 간단히 몇개의 수만 분석해도 깨달을 수 있을 것이다.
위의 예시인 8을 보자. 8의 약수는 1 2 4 8 이다. 따라서 1 * 8 = 8 혹은 2 * 4 = 8 로 알 수 있다.
이번에는 16을 보자. 16의 약수는 1 2 4 8 16 이다. 이 때는 1 * 16 = 16, 2 * 8 = 16, 4 * 4 = 16 으로 알 수 있다.
마지막으로 24를 보자. 24의 약수는 1 2 3 4 6 8 12 24 이다. 역시 1 * 24, 2 * 12, 3 * 8, 4 * 6 으로 알 수 있다.
이처럼 가운데를 기준으로 나눠서 대칭되는 왼쪽과 오른쪽을 곱하면 그 수가 나오게 된다.
#include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <string> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; cin >> N; long long nn[51] = { 0, }; for(int i = 0; i < N; i++){ cin >> nn[i]; } sort(nn, nn + N); cout << nn[0] * nn[N - 1]; return 0; }
댓글
댓글 쓰기