728x90
문제설명

 XX사에서 만든 디지털 도어락은 내부적으로 보안키 값을 가지고 있고, 이 값은 1,000이하의 자연수로 이루어져 있다. 각 카드키들은 ID값을 가지고 있는데, 이 값이 도어락의 내부 보안키 값의 약수이면 이 도어락을 열 수 있다.

길동이는 △△사에서 근무하고, △△사는 XX사에서 만든 디지털 도어락을 쓴다. 길동이가 자신의 사무실로 가기 위해서는 3개의 문을 통과해야 한다. 길동이는 자신이 통과해야하는 3개의 문의 내부 보안키 값을 알고 있을 때, 이 3개의 문을 모두 열 수 있는 만능 보안키를 여러분에게 의뢰했다. 길동이를 도와주자.

단, 보안키의 ID값이 클수록 제작비용이 적다. 최소한의 비용을 마스터 보안키를 만드는 프로그램을 작성하시오.

 

 

입력

세 자연수가 공백으로 구분되어 입력된다.

각 값들은 도어락의 내부 보안키의 값을 의미한다.

각 값은 1,000이하의 자연수이다.

 

 

출력

가장 가격이 저렴한 만능 보안키의 ID값을 출력한다.

 

 

입력 예시

10 20 30

 

 

출력 예시

10


#include <stdio.h>
#include <stdlib.h>
int gcd(int a,int b){
    while(b!=0){
        int temp=a%b;
        a=b;
        b=temp;
    }
    return abs(a);
}
int main(void){
    int a,b,c,temp;
    scanf("%d %d %d", &a, &b,&c);
    temp=gcd(a,b);
    printf("%d", gcd(c,temp));

    return 0;
}

이 문제에 대한 문제풀이도 딱히 없어서 조금 어려웠다. 한사람의 풀이를 보고 풀게 되었다.

처음에는 함수로 풀어야 되겠다는 생각이 들지 않았다. 처음에 생각한 것은 배열형태로 비교할까 싶었다.

그리고 생각한 것, 메인 함수 안에서만 해결해야 겠다는 생각이 들었다. 그런데 이것을 분석하다 보니 효율적인 코드가 아니였다. 위의 형태가 가장 이상적이었다. 그리고 위에서 gcd를 단순한 함수라고 생각했는데 아니였다.

 

gcd는 최대공약수, abs는 절댓값

이것을 이용한 것이였다. 그래서 a와 b의 값을 이용해 나머지를 구했고 나온 값을 다시 c의 값과 비교해서 도출해낸 것이였다. 잠시 잊고 있었던 특정 용어들, 최대 공약수, abs 절댓값을 잊어버리면 안되겠다는 생각이 든다. 이것을 이용해 최대 공약수를 구한다. 그래서 나머지 구하는 것이다. 이후 절댓값으로 반환해 temp로 지정해준다. temp가 과정에서 2번 나오는데 지역변수로 다루었기 때문에 큰 문제가 없다.

728x90

+ Recent posts