새벽을 밝히는 붉은 달

[C] 백준 14910번: EOF를 만날 때 scanf를 끝내는 방법 본문

Online Judge

[C] 백준 14910번: EOF를 만날 때 scanf를 끝내는 방법

자윰 2020. 9. 8. 03:04

📎 백준 14910번 풀러 가기

 

14910번: 오르막

첫째 줄에 공백으로 구분된 N(1 ≤ N ≤ 1,000,000)개의 정수가 주어진다. 입력으로 주어지는 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

주어진 N개의 정수가 비내림차순으로 나열되어 있는지 판정하는 프로그램을 작성하시오. N개의 수 A1, A2, ..., AN이 A1 ≤ A2 ≤ ... ≤ AN 을 만족하는 것을 비내림차순이라고 한다.

입력

첫째 줄에 공백으로 구분된 N(1 ≤ N ≤ 1,000,000)개의 정수가 주어진다. 입력으로 주어지는 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

비내림차순으로 나열되어 있으면 Good을 출력하고, 그렇지 않으면 Bad을 출력한다.


오늘도 이전에 못 풀었던 문제이다!

예전에 왜 틀렸는지는 잘 모르겠다. 아마 입력에서 틀리지 않았을까 싶다.

 

처음에는 gets()함수를 이용해서 입력을 받으려고 했는데,

gets()는 개행문자 단위로 입력을 받기 때문에 위 문제의 공백을 거를 수는 없었다.

 

그래서 scanf()로 입력을 받기로 했는데, EOF(End of File)을 만나면 어떻게 멈추어야 할지를 잘 모르겠는 거다!

일단 변수를 받은 다음에, 그 변수가 EOF인지를 체크하는 식을 생각했다.

 

구글링을 해보니 더 좋은 방식의 입력방식이 있었다.

위 문제처럼 입력받을 경우 while(scanf("%d", &n) != EOF) 로 하면

EOF를 만나기 전까지 쭉 입력을 받게 된다.

 

앞으로 비슷한 입력 문제를 만날 때, 자주 애용을 해야겠다😊


아래는 내가 구현한 코드👇

#include <stdio.h>

int main(void)
{
    int current, next;
    scanf("%d", &current);
    while (scanf("%d", &next) != EOF) {
        if (current > next) {
            printf("Bad\n");
            return 0;
        }
        else current = next;
    }

    printf("Good\n");
    return 0;
}

✍새로 안 사실들

1. '1 2 3 4 5' 처럼 EOF를 만나기 전까지 입력을 받아야 하는 경우,

    while(scanf("%d", &n) != EOF) 를 사용하면 된다.

Comments