반응형



여러 수가 주어질 때 그 수의 최댓값 및 최솟값을 구하는 알고리즘이다.

 

        

예)  입력 : 5

       1 2 3 4 5 

   

       출력 : 1 5


범위는

 

입력 할 수 있는 개수

1 <= n <= 1000000


그 수의 값의 범위

-1000000 <= num <= 1000000


이라고 가정한다.



<Case 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
#include <stdio.h>
 
int main() 
{
    int N;
    int max = 0, min = 0, temp = 0;
    int i;
 
    scanf("%d",&N);
    scanf("%d",&temp);
 
    max = min = temp;
 
    for (i = 0; i < N - 1; i++)
    {
        scanf("%d",&temp);
 
        if (temp > max)
            max = temp;
        else if (temp < min)
            min = temp;    
    }
    printf("%d %d",min,max);
 
 return 0;
 
}
Crocus








<Case 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
33
34
35
36
37
#include <stdio.h>
 
 int a[2000002= {0,}; // -1000000 ~ 1000000 값 대입을 위한 배열
 
int main()
{   
 int i,n,num;
 
 scanf("%d", &n);
 
 for(i = 0 ; i < n ; i ++)
 {
  scanf("%d", &num);
  a[num+1000000= num; // -값들을 배열에 넣을 수 없으니 -1000000을 0으로 본다.
 }
 
 
 for(i = 0; i <= 2000000; i ++)
 {
  if(a[i] != 0// 즉, 처음 배열에 null값이 아닌 수가 나오는 것이 최솟값
  {
   printf("%d ",a[i]); // 만약 -1000000이 최솟값이면 a[0]에 있을 것이고 a[0]를 출력하면 -1000000이 나온다.
   break// 탈출
  }
 }
 
 for(i = 2000000 ; i >= 0 ; i--// 위와 반대로 시행(최댓값 찾기)
 {
  if(a[i] != 0)
  {
   printf("%d",a[i]);
   break;    
  }     
 }
    return 0;
}
 
Crocus




case 1과 case 2의 차이는 무엇일까?


시간 복잡도와 공간 복잡도의 차이이다.


case 1은 확실히 메모리 사용량이 적다는 것을 시각적으로 확인이 가능하다.


하지만, 최악의 경우 100만개의 수를 다 입력하면


O(n)은 1000000이 될 것이다.



아래의 경우는 어떠한가?


case 2는 공간적인 낭비가 심하다. 즉 공간 복잡도가 크다.


하지만 시간 복잡도를 따져본다면


최악의 경우


100만개의 수를 입력 받으면 a[1000000] = -1000000,  a[1000001] = 1000000이 온다면


O(n) = 2000000이 될 것이다.


하지만, 상황에 따라 Case 1보다 Case 2가 시간복잡도에서 유리한 경우들이 많이 있다.


ex ) 입력받은 값이 1 2 3 4 5면


case 1 O(n) = 5

case 2 O(n) = 2


즉, 상황에 따라 어느 알고리즘을 쓰는 것은 코더의 코드에 달려있다.


하지만 보편적으로 본다면 case 1의 코드가 좋은 것은 자명한듯 하다.

















반응형

'Applied > 알고리즘' 카테고리의 다른 글

단어 검색 알고리즘  (0) 2016.07.06
선택 정렬(Selection Sort)  (0) 2016.04.12
재귀 함수  (0) 2015.11.27
빅-오 표기법(Big-Oh Notation)  (0) 2015.11.23
이진 탐색 알고리즘(Binary Search) - 소스코드  (0) 2015.11.23