작성일 :

문제 링크

14910번 - 오르막

설명

공백으로 구분된 정수 수열이 주어지는 상황에서, 수열의 개수 N (1 ≤ N ≤ 1,000,000)과 각 정수가 한 줄에 주어질 때, 수열이 비내림차순인지 판정하는 문제입니다.

비내림차순은 A₁ ≤ A₂ ≤ … ≤ Aₙ을 만족하는 수열을 의미합니다. 즉, 다음 수가 이전 수보다 크거나 같아야 합니다. 조건을 만족하면 Good을, 아니면 Bad를 출력합니다.


접근법

수열을 앞에서부터 순회하며 비내림차순 조건을 확인합니다.


먼저 첫 번째 수를 기준으로 시작하여 다음 수를 읽을 때마다 이전 수와 비교합니다. 현재 수가 이전 수보다 작다면 비내림차순 조건이 깨지므로 즉시 Bad를 출력하고 종료합니다.

이렇게 모든 수를 확인할 때까지 조건이 한 번도 깨지지 않으면 Good을 출력합니다.


예를 들어, 수열 [1, 3, 3, 5, 7]은 각 수가 이전 수보다 크거나 같으므로 Good입니다. 반면 [1, 3, 2, 5]는 세 번째 수(2)가 두 번째 수(3)보다 작으므로 Bad입니다.


각 수를 한 번씩만 확인하므로 시간 복잡도는 O(N)입니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Linq;

class Program {
  static void Main() {
    var tokens = Console.ReadLine()!.Split();
    bool ok = true;
    int prev = int.MinValue;
    for (int i = 0; i < tokens.Length; i++) {
      int cur = int.Parse(tokens[i]);
      if (i > 0 && cur < prev) { ok = false; break; }
      prev = cur;
    }
    Console.WriteLine(ok ? "Good" : "Bad");
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  bool ok = true;
  int prev, cur;
  if (!(cin >> prev)) return 0;
  while (cin >> cur) {
    if (cur < prev) { ok = false; break; }
    prev = cur;
  }
  cout << (ok ? "Good" : "Bad") << "\n";
  return 0;
}