[백준 알고리즘] 1037 : 약수

예시 입력 :

2
4 2


예시 출력 : 

8


문제를 간단히 정리하면 1과 N이 아닌 약수를 제공할테니 실제 숫자를 구하라. 그렇다. 썩 어렵지 않은 문제다. 하지만 필자는 틀린 경험이 있다. 그것도 10개월 전.



10개월 전 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace BackJoonCS
{
    class Program
    {
        static void Main(string[] args)
        {
            String number = Console.ReadLine();

            String input2 = Console.ReadLine();
            String[] a = input2.Split(new char[] { ' ' });
            int[] x = new int[int.Parse(number)];
            
            for(int i=0;i< int.Parse(number);i++)
            {
                x[i] = int.Parse(a[i]);
            }
            int realnum = 0;
            if (int.Parse(number) > 0)
            {
                realnum = 1;
                for (int i = 0; i < int.Parse(number); i++)
                {
                    realnum *= x[i];
                }
            }
            Console.WriteLine(realnum);
        }
    }
}

모든 약수를 곱한것을 실제 숫자로 취급하고 있다. ㅋㅋㅋㅋㅋㅋㅋ 뭐하는 사람이었을까? 10개월 전에 나는…



1차 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using namespace std;

int main(void) {
    int mNumber = 0;
    cin >> mNumber;
    int *p = new int[mNumber];
    for(int i=0;i<mNumber;i++){
        cin >> p[i];
    }
    int N = p[0]*p[mNumber-1];
    cout << N;
    delete p;
    return 0;
}

필자의 머릿속의 약수는 항상 정렬이 되어있다. 가령 12의 약수라면 1, 2, 3, 4, 6, 12 인데 1과 12는 나타내지 않으므로 첫번째 수(2)와 마지막 수(6)을 곱한 값이 진짜 숫자가 된다고 생각했다. 하지만 이것은 필자의 망상이었을 뿐, 제발 입력되는 값은 내 예상과 틀리다는 생각을 잊지말자!!!



2차 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>

using namespace std;

int main(void) {
    int mNumber = 0;
    int max=0, min=1000001;
    cin >> mNumber;
    int *p = new int[mNumber];
    for(int i=0;i<mNumber;i++){
        cin >> p[i];
        if(min > p[i]) min = p[i];
        if(max < p[i]) max = p[i];
    }
    int N = min*max;
    cout << N << endl;
    delete p;
    return 0;
}

그래서 생각한 방법은 숫자를 정렬하거나 최솟값 최댓값을 찾아서 곱셈을 해주는 방식이었다. 정렬을 했을경우 약수가 1개일때 등을 고려해야하는 문제가 있으므로 간단하게 최솟값 최댓값을 구하는 방식을 적용했다.


WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus