본문 바로가기
알고리즘 문제풀이

[알고리즘] 최대최소

by 마스터누누 2017. 4. 18.
728x90
반응형

최대최소


최대 최소를 구하는 기본적인 문제이다.


사용자로부터 두개의 변수를 받아 최대와 최소값을 출력하는 프로그램을 짜보자


INPUT

num1, num2


OUTPUT

min_num

max_num





1. 모든 계산이 main 함수에 위치한 코드


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
#include<stdio.h>
 
int main() {
    int num1, num2;
 
    scanf_s("%d %d"&num1, &num2);                                                                   
 
    if (num1 > num2) {
        printf("%d\n", num2);
    }
    else if (num2 > num1) {
        printf("%d\n", num1);
    }
 
    if (num1 > num2) {
        printf("%d\n", num1);
    }
    else if (num2 > num1) {
        printf("%d\n", num2);
    }
    
    return 0;
}
 
 
cs


'모로 가도 서울만 가도 된다'는 말이 있듯이 

알고리즘 문제풀이에서 어떻게 보면 답만 나오면 된다고 생각 하는 경우가 많다. 

그러나 실제 코드 사용에서는 결과 뿐만 아니라 과정, 

더 나아가 유지보수와 코드의 효율성 측면, 

심지어 메모리 구조까지 고려하는 경우가 있다. 

따라서 알고리즘 문제를 풀때는 습관적으로 효율적인 코드로 제작하는 것이 좋다. 

 

위의 코드는 min, max 값이 모두 나오지만 코드의재사용성 측면이나 효율성에서 

매우 안좋은 모습을 보인다. 

다음 코드를 살펴보자





2. 계산식을 함수로 분리

 

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
30
31
32
#include<stdio.h>
 
int main() {
    int num1, num2;
 
    scanf_s("%d %d"&num1, &num2);                                                                 
 
    min(num1,num2);
    max(num1, num2);
    
    return 0;
}
 
int min(int num1, int num2) {
 
    if (num1 > num2) {
        printf("%d\n", num2);
    }
    else if (num2 > num1) {
        printf("%d\n", num1);
    }
}
 
int max(int num1, int num2) {
    if (num1 > num2) {
        printf("%d\n", num1);
    }
    else if (num2 > num1) {
        printf("%d\n", num2);
    }
}
 
cs


계산하는 식을 max와 min, 두개의 함수로 분리하여 코드를 짜보았다. 

처음 코드보다 좀 더 복잡하고 늘어나 보인것 같지만, 

계산이 필요한 곳에 함수명으로 호출하여 사용할 수 있다는 큰 장점이 있다. 

그러나 아직까지 분리된 함수가 복잡해 보인다.

함수의 특성을 활용하여 분리된 함수 내부를 최적화 해보자





3. 함수 내부 최적화


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
#include<stdio.h>
 
int main() {
    int num1, num2;
 
    scanf_s("%d %d"&num1, &num2);                                
 
    printf("%d\n", min(num1,num2));
    printf("%d\n", max(num1, num2));
    
    return 0;
}
 
int min(int num1, int num2) {
    if (num1 < num2)
        return num1;
    return num2;
}
 
int max(int num1, int num2) {
    if (num1 > num2) 
        return num1;
    
    return num2;
}
 
cs


return이 가능한 함수의 성질을 이용하여 조건문을 단순화 하였다. 

위에서도 말했듯이 이렇게 main에서 함수를 분리하는 것은 재사용성을 늘려주고, 

에러 발생시 전체코드를 수정하지 않고 특정 함수 하나만 수정하면 되는 편리함이 있다. 최대 최소의 경우 쉬운 문제지만 좀 더 난이도 있는 문제를 만날 경우 

코드가 길어지고 복잡해질수 있으니 모듈화를 습관화 하자.


반응형

댓글