본문 바로가기

카테고리 없음

01-1 알고리즘이란?

실습 1-1 // 세 값의 최댓값

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 a, b, c, max;
    
    printf("정수 1 입력 : ");
    scanf("%d"&a);
    printf("정수 2 입력 : ");
    scanf("%d"&b);
    printf("정수 3 입력 : ");
    scanf("%d"&c);
    /*
내가 짜본 코드
    if (a > b)
        max = a;
    else max = b;
    if (c > max)
        max = c;
    */
    max = a;
    if (max < b) max = b;
    if (max < c) max = c;

    printf("세 정수 중 최댓값은 %d\n", max);
    return 0;
        
}
cs

연습문제

//네 값의 최댓값을 구하는 함수 max4

1
2
3
4
5
6
7
8
int max4(int a, int b, int c, int d)
{
    int max = a;
    if (b > max) max = b;
    if (c > max) max = c;
    if (d > max) max = d;
    return max;
}
cs

//세 값의 최솟값을 구하는 함수 min3

1
2
3
4
5
6
7
8
int min3(int a, int b, int c)
{
    int min = a;
    if (b < min) min = b;
    if (c < min) min = c;
    
    return min;
}
cs

//네 값의 최솟값을 구하는 함수 min4

1
2
3
4
5
6
7
8
int min4(int a, int b, int c, int d)
{
    int min = a;
    if (b < min) min = b;
    if (c < min) min = c;
    if (d < min) min = d;
    return min;
}
cs

보충수업 1-4

//세 수 a,b,c의 대소 관계는 13가지? 계산해보기

a> ~인 경우 : 

a>b>c : 6가지

a>b=c : 3가지

a= ~인 경우 :

a=b>c : 3가지

a=b=c : 1가지

----------------------

13가지


 //중앙값을 구하는 알고리즘


생각해보기:

우선 앞의 두 수를 비교했을 때 

-두 수의 크기가 다르다면

max=(a>b)? a:b;

min=(a<b)? a:b;

if(c<max)

if(c>min) med=c;//두 수 사이에 있으므로 중앙값은 c

else med=min;//c가 최솟값이므로 중앙값은 min

else

med=max;//c가 최댓값보다 크므로 중앙값은 max

-두 수의 크기가 같다면 그 값이 중앙값이다.

if(a==b) med=a;


 위의 생각으로 짠 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int med3(int a, int b, int c)
{
    int max, min, med;
 
    if (a == b) med = a;
    else
    {
        max = (a > b) ? a : b;
 
        min = (a < b) ? a : b;
 
        if (c < max)
        {
            if (c > min)
                med = c;
            else med = min;
        }
        else med = max;
 
    }
    return med;
}
cs

실습 1C-1//대소관계 트리에 따라서 구하는 프로그램

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
33
34
#include <stdio.h>
 
int med3(int a, int b, int c)
{
    if (a >= b)
        if (b >= c)
            return b;
        else if (a <= c)//a>=b이고 b<c인 경우에 a,c의 대소 확인=>크지 않은 값
            return a;
        else return c;
    else if (a > c)//a<b이고 a>c인 경우 : c<a<b
        return a;
    else if (b > c)//a<b이고 a<=c이고 b>c인 경우 : a<=c<b 
        return c;
    else
        return b;//a<b이고 a<=c이고 b<=c인 경우 : a<b<=c
 
}
 
int main()
{
    int a, b, c;
    printf("정수 입력 : ");
    scanf("%d"&a);
 
    printf("정수 입력 : ");
    scanf("%d"&b);
 
    printf("정수 입력 : ");
    scanf("%d"&c);
    printf("중앙값은 %d\n",med3(a,b,c));
 
    return 0;
}
cs

연습문제

//아래 함수가 위의 실습 1C-1의 함수보다 효율이 떨어지는 이유

1
2
3
4
5
6
7
8
9
int med3(int a, int b, int c)
{
    if ((b >= a && c <= a) || (b <= a && c >= a))// c<=a<=b이거나 b<=a<=c인 경우
        return a;
    else if ((a > b && c < b) || (a < b && c > b))// c<b<a이거나 a<b<c인 경우
        return b;
    return c;
}
 
cs
3번째 줄에서 b<=a 와 b<=a중에 하나가 무조건 true임에도 if문이 false인 경우에 5번째 줄에서 같은 판단(a>b, a<b)를 하게 된다. 

//나의 코드를 다시 점검해 보자면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int med3(int a, int b, int c)
{
    int max, min;
 
    if (a == b) return a;
    else
    {
        max = (a > b) ? a : b;
 
        min = (a < b) ? a : b;
 
        if (c < max)
        {
            if (c > min)
                return c;
            else return min;
        }
        else return max;
 
    }
}
cs

우선 med를 지우고 return으로 코드를 줄여봤다.

1. a==b인 경우를 걸러낸다

2. a!=b인 케이스에 한해 

a,b중 큰 값을 max에, 작은 값을 min에 대입하는 과정에서 a와 b의 대소 판단을 반복했다.

-> 줄을 합쳐 작성해보았다. 한 번의 판단으로 가능해졌다.

1
(a > b) ? (max = a, min = b) : (max = b, min = a);
cs


그 이후로 반복되는 판단은 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int med3(int a, int b, int c)
{
    int max, min;
 
    if (a == b) return a;
    else
    {
        (a > b) ? (max = a, min = b) : (max = b, min = a);
 
        if (c < max)
        {
            if (c > min)
                return c;
            else return min;
        }
        else return max;
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int med3(int a, int b, int c)
{
    if (a >= b)
        if (b >= c)
            return b;//c<=b<=a
        else if (a <= c)
            return a;//b<=a<=c
        else return c;
    else if (a > c)//c<a<b
        return a;
    else if (b > c)//a<=c<b 
        return c;
    else
        return b;//a<b<=c
 
}
cs
**다음에 시간이 될 때 내가 만든 코드를 다시 살펴볼 것이다. 아래 코드는 중앙값이 두 번, 혹은 세 번의 판단으로 결정된다.


프로그램 순서도(Program Flowchart) 기호

평행사변형 -> 데이터의 입출력

직사각형-> 처리

좌우 테두리가 있는 직사각형 -> 미리 정의한 처리

마름모 -> 판단 :하나의 입구와 하나 이상을 선택할 수 있는 출구(스위치 기능) 

쪼개놓은 팔각형 -> 루프(반복) 범위

선 -> 제어의 흐름

둥근 사각형 -> 단말 : 외부환경으로 나가거나 외부환경에서 들어오는 것 (ex- 프로그램 흐름의 시작과 종료)