작성일 :

문제 링크

32280번 - 지각생

설명

학생과 선생님의 도착 시각이 주어질 때, 지각 사실이 들켜 청소를 하게 되는 학생 수를 구하는 문제입니다.


접근법

먼저 모든 시각을 분 단위로 바꿔 비교 가능하게 만듭니다.

다음으로 선생님의 도착 시각을 따로 기록합니다.

이후 학생이 정해진 등교 시간 이후에 도착했고 선생님보다 늦게 들어왔다면 청소 대상에 포함합니다.

마지막으로 해당 학생 수를 출력합니다.



Code

C#

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
using System;
using System.Collections.Generic;

class Program {
  static int ToMinutes(string s) {
    var parts = s.Split(':');
    var h = int.Parse(parts[0]);
    var m = int.Parse(parts[1]);
    return h * 60 + m;
  }

  static void Main() {
    var parts = Console.In.ReadToEnd().Split();
    var idx = 0;
    var n = int.Parse(parts[idx++]);

    var students = new List<int>();
    var teacher = -1;
    for (var i = 0; i < n + 1; i++) {
      var time = parts[idx++];
      var who = parts[idx++];
      var t = ToMinutes(time);
      if (who == "teacher") teacher = t;
      else students.Add(t);
    }

    var school = ToMinutes(parts[idx++]);
    var cnt = 0;
    foreach (var t in students) {
      if (t >= school && t >= teacher) cnt++;
    }

    Console.WriteLine(cnt);
  }
}

C++

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 <bits/stdc++.h>
using namespace std;

int toMinutes(const string &s) {
  int h = (s[0] - '0') * 10 + (s[1] - '0');
  int m = (s[3] - '0') * 10 + (s[4] - '0');
  return h * 60 + m;
}

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

  int n; cin >> n;
  vector<int> students;
  students.reserve(n);
  int teacher = -1;

  for (int i = 0; i < n + 1; i++) {
    string time, who;
    cin >> time >> who;
    int t = toMinutes(time);
    if (who == "teacher") teacher = t;
    else students.push_back(t);
  }

  string schoolStr; cin >> schoolStr;
  int school = toMinutes(schoolStr);

  int cnt = 0;
  for (int t : students) {
    if (t >= school && t >= teacher) cnt++;
  }

  cout << cnt << "\n";
  return 0;
}