C언어 두 번째 큰 수 찾기


C언어 두 번째 큰 수 찾기


이번에는 if 문을 이용해 두 번째 큰 수를 찾는 알고리즘을 알아보자.

a, b, c 3개의 정수를 입력받고 두 번째로 큰 수를 찾아보자.

그럼 어떻게 접근을 해야 될까? 간단하게 생각해보자.

그냥 다 비교하면 된다.


문제 : a, b, c 3개의 정수를 입력받고 두 번째 큰 정수를 출력해보자.


input : 30 20 10

output : 20


input : 20 30 10

output : 20


input : 10 20 30

output : 20




소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
main()
{
    int a, b, c;
    scanf_s("%d %d %d"&a, &b, &c);
    if (a > b) {
        if (b < c) {
            if (c < a)
                printf("%d\n", c);
            else printf("%d\n", a);
        }
        else printf("%d\n", b);
    }
    else { // a < b, a==b
        if (b > c) {
            if (c < a) printf("%d\n", a);
            else printf("%d\n", c);
        }
        else printf("%d\n", b);
    }
}
cs

소스코드는 이렇게 그냥 3개의 정수를 다 비교하면 된다.
소스 분석을 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (a > b) {
        if (b < c) {
            if (c < a)
                printf("%d\n", c);
            else printf("%d\n", a);
        }
        else printf("%d\n", b);
    }
    else { // a < b, a==b
        if (b > c) {
            if (c < a) printf("%d\n", a);
            else printf("%d\n", c);
        }
        else printf("%d\n", b);
    }
cs

첫 번째 줄에서 a가 b보다 크면? b가 c보다 작으면 b를 출력해라.
근데 c가 a보다 크면? c를 출력하고 아니면 a를 출력해라.
만약 a가 b보다 작거나 a와 b가 같을 때, b가 c보다 작으면 b를 출력하고
c가 a보다 작으면 a를 출력하고 아니면 c를 출력해라.

알고리즘은 간단하다.
그냥 다 비교해주면 된다.

다른 방식으로는 이 3개의 정수를 정렬을 해줘서 출력하는 방법도 있다. (정답은 없다.)
정렬 방법은 간단하게 버블 정렬을 써보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdbool.h>
main()
{
    int a[3];
    scanf_s("%d %d %d"&a[0], &a[1], &a[2]);
    bool flag = true;
 
    for (int i = 3 - 1; i > 0 && flag; i--) {
        for (int j = 0; j < i; j++) {
            flag = false;
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1= temp;
                flag = true;
            }
        }
    }
    printf("%d", a[1]);
}
cs

이러한 방법도 있다.

소스분석은 위의 버블 정렬 링크를 가서 확인해보면 되지만
다시 한번 분석을 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 3 - 1; i > 0 && flag; i--) {
        for (int j = 0; j < i; j++) {
            flag = false;
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1= temp;
                flag = true;
            }
        }
    }
    printf("%d", a[1]);
cs

첫 번째 줄에서 for 문은 2번만 돌거나 flag 값이 false 일 때까지만 돌게 해놨다.
두 번째 줄에서 for 문은 j < i까지 돌게 해놨고
flag를 false로 지정해놨다. 왜냐면 값 변경이 일어나지 않으면 반복문을 그만 돌게끔 해놨다.
if 문은 값을 체인지 하는 것이다. 값 변경이 일어날 경우 flag 값을 true로 나타낸다. 그래야 반복문이 돌아가니까.
그리고 마지막에 2번째 값을 출력해준다.

이러한 방법 말고도 여러 가지의 방법이 있을 것이다.
단 메모리 사용이 적고 빠르게 실행되는 것이 좋은 알고리즘이다.

댓글

Designed by JB FACTORY