백준 알고리즘 | 1037번 문제: 약수

출처

https://www.acmicpc.net/problem/1037

문제

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

입력

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

출력

첫째 줄에 N을 출력한다. N은 항상 32비트 부호있는 정수로 표현할 수 있다.

예제 입력 1

2
4 2

예제 출력 1

8

예제 입력 2

1
2

예제 출력 2

4

예제 입력 3

6
3 4 2 12 6 8

예제 출력 3

24

예제 입력 4

14
14 26456 2 28 13228 3307 7 23149 8 6614 46298 56 4 92596

예제 출력 4

185192

알고리즘 분류

  • 수학
  • 브루트포스 알고리즘
  • 정수론

문제 풀이

약수란? 어떤 수를 나누어 떨어지게 하는 수를 그 수을 말한다. 예를 들어 8을 1, 2, 4, 8,로 나누면 나누어 떨어진다. 1, 2, 4, 8은 8의 약수이다.

문제에서는 “양수 A가 N의 진짜 약수가 되려면, N이 A의 배수이고, A가 1과 N이 아니어야 한다"라고 했으므로, 8이라는 숫자가 주어지면, 1, 8을 제외한 2, 4가 진짜 약수가 된다.

모든 진짜 약수가 주어지므로, 진짜 약수 중 가장 작은 값과 가장 큰 값의 곱이 원래 값 N의 값과 같다.
N을 2개의 수의 곱으로 나타낼 때, 가장 작은 약수와 가장 큰 약수의 곱으로 나타내어지기 때문이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            int n = Integer.parseInt(br.readLine());
            StringTokenizer nums = new StringTokenizer(br.readLine(), " ");

            int max = Integer.MIN_VALUE;
            int min = Integer.MAX_VALUE;
            for(int i = 0; i < n; i++) {
                int num  = Integer.parseInt(nums.nextToken());
                if(num > max) max = num;
                if(num < min) min = num;
            }
            System.out.println(max * min);

        }
    }
}