최대최소
최대 최소를 구하는 기본적인 문제이다.
사용자로부터 두개의 변수를 받아 최대와 최소값을 출력하는 프로그램을 짜보자
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에서 함수를 분리하는 것은 재사용성을 늘려주고,
에러 발생시 전체코드를 수정하지 않고 특정 함수 하나만 수정하면 되는 편리함이 있다. 최대 최소의 경우 쉬운 문제지만 좀 더 난이도 있는 문제를 만날 경우
코드가 길어지고 복잡해질수 있으니 모듈화를 습관화 하자.
'알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘] 큐(Queue)를 이용한 대기번호 (0) | 2017.04.18 |
---|---|
[알고리즘] 배열의 범위 회전 (0) | 2017.04.18 |
[알고리즘] 두 변수의 값 바꾸기 (0) | 2017.04.18 |
[알고리즘] 배열의 최대값 구하기 (0) | 2017.04.18 |
[알고리즘] C언어 배열을 활용한 Stack 구현 (2) | 2017.04.18 |
댓글