본문 바로가기

스파르타 알고리즘 트랙 문제(백준)/6일차

스파르타 알고리즘 트랙 문제 6일차 - 2 #1037 약수

문제

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

 

해결 과정

1과 자기 자신을 제외한 모든 약수가 주어질 때, N을 구하는 것은 모든 약수 집합 중, 최댓값과 최솟값을 곱하면 간단히 값을 구할 수 있다.

인수분해 시 소수의 제곱 형태의 정수 N은 1과 자기 자신을 제외한 모든 약수의 갯수는 1개이기에 해당 수를 제곱하여야 하나, 최댓값과 최솟값이 동일한 약수 집합으로 생각하면 위 과정과 동일함을 알 수 있다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader a = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.parseInt(a.readLine());
        String[] arr = a.readLine().split(" ");
        int max = Integer.parseInt(arr[0]);
        int min = Integer.parseInt(arr[0]);
        
        for (int i = 0;i<arr.length;i++) {
            if (max < Integer.parseInt(arr[i]))
                max = Integer.parseInt(arr[i]);
            else if (min > Integer.parseInt(arr[i])){
                min = Integer.parseInt(arr[i]);
            }
        }
        System.out.println(max*min);
    }
}

큰 문제 없이 정답을 해결하였으나, 반복문이 아닌 배열 내 메소드에서 최댓값과 최솟값을 확인하는 방법이 있지 않을까 고민하였다. 다행히, Arrays.stream(array).min().getAsInt()를 사용하면 최솟값을, min 자리에 max를 사용하면 최댓값을 구할 수 있음을 확인하였다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader a = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.parseInt(a.readLine());
        String[] arr = a.readLine().split(" ");
        int max = Integer.parseInt(arr[0]);
        int min = Integer.parseInt(arr[0]);
        int[] arr1 =new int[arr.length];
        
        for (int i = 0;i<arr.length;i++) 
            arr1[i] = Integer.parseInt(arr[i]);
        
        int maxnum = Arrays.stream(arr1).max().getAsInt();
        int minnum = Arrays.stream(arr1).min().getAsInt();
        System.out.println(maxnum*minnum);
    }
}

두 코드 모두 문제 없이 실행됨을 확인하였기에 최대, 최소 문제는 둘 중 어느 한 쪽을 선택하면 될 듯하다.