본문 바로가기
지난 학기들의 기록/C 기초

[C실습] 두번째로 빠른 문자 출력하기

by 아메리카노와떡볶이 2020. 5. 10.
728x90

배열을 사용하지않는 두번째로 작은 수가 핵심 키워드였는데, 반복문안에서 구현했어야했다. 시험도중에는 계속 가장 작은수를 찾고 그 수와 차잇값을 가지고 어떻게 해보려는 시도를 했었었는데 실패했다.

시험이 끝난 후, 틀린문제를 복습해보면서 공부한 알고리즘은 다음과 같다.

 

가장 작은 수를 smallest, 두번째로 작은수를 sec_smallest 라 하자.

그럼 두가지 경우로 나누어 생각할수있다.

1) 입력된 숫자 N이 있을때 그 수가 가장 작은 수인 smallest보다 작은 경우.

   이렇게되면 N->smallest자리에 smallest->sec_smallest에 들어가게된다.

   if(N<smallest){

      sec_smallest=smallest;

      smallest=N;

     }

2)그리고 입력된 숫자 N이, smallest보다는 크지만 sec_smallest보다는 작은 경우가 있다.

  이 경우는 단순하게 N->sec_smallest의 자리에 가면 된다.

 

   else if(N<sec_smallest){ // smallest<N<sec_smallest

   sec_smallest=N;

   }

 

위와같은 핵심 알고리즘을 통해 완성된 코드는 다음과 같다 

#pragma warning (disable:4996)
#include <stdio.h>

 

/* 소문자를 입력받아서 알파벳 순서로 가장 빠른 문자와, 그 다음으로 빠른 문자 출력하기 */

/* 두 가지 케이스로 나누어서 푼다
1.입력받은수가 가장 작은수보다 작다면
2.입력받은수가 가장 작은수보단 크고 두번째 작은수보단 작다면?*/

int main() {

    char smallest_ch1 = 'z'; //가장 빠른 
    char smallest_ch2 = 'z';//두번째로 빠른
    char ch; 
    
    
    scanf("%c", &ch);
    
    while (1) {
        if ('a' <= ch && ch <= 'z') {
            if (ch < smallest_ch1) {
                smallest_ch2 = smallest_ch1;
                smallest_ch1 = ch;
               
            }
            else if (ch < smallest_ch2) {
                smallest_ch2 = ch;
            }
        }
        else break;
        scanf("%c", &ch);
    }
    printf("%c%c", smallest_ch1, smallest_ch2);
    return 0;

}

728x90

댓글