[C] 31776번: 예비 소집 결과 보고서
[C] 31776번: 예비 소집 결과 보고서

문제
https://www.acmicpc.net/problem/31776
PPC 본 대회 하루 전에는 참가 팀들의 환경 적응을 위한 예비 소집이 진행된다. 예비 소집에는 3문제가 사용되었으며, N팀이 참여하였다. 각 문제와 팀에는 1번부터 차례대로 번호가 붙어 있다. PPC 운영진들은 예비 소집이 얼마나 효과적이었는지 알아보기 위해 보고서를 작성해 보기로 했다.
예비 소집의 효과를 알아내기 위해서는 성실하게 참여한 팀의 수를 구해야 한다. 예비 소집에 성실하게 참여한 팀이란 다음과 같은 조건을 만족하는 팀이다.
- 세 문제 중 최소 하나를 해결하였다.
- 문제를 번호가 작은 것부터 해결하였다. 즉, 어떤 문제를 시간 에 해결했을 때 그보다 번호가 작은 문제들은 모두 해결하였으며 해결 시간이 이하이고, 그보다 번호가 큰 문제들은 해결하지 않았거나 해결 시간이 이상이어야 한다.
각 팀이 각 문제를 해결한 시간이 주어질 때, 예비 소집에 성실하게 참여한 팀의 수를 구하여라.
입력
첫 번째 줄에 예비 소집에 참여한 팀의 수 이 주어진다.
두 번째 줄부터 개의 줄에 걸쳐 각각 번 팀이 번 문제, 번 문제, 번 문제를 해결한 시간을 의미하는 개의 정수 이 공백으로 구분되어 주어진다. 만약 번 팀이 번 문제를 해결하지 않았다면 이다.
출력
예비 소집에 성실하게 참여한 팀의 수를 출력한다.
풀이
성실하게 참여한 팀의 조건을 3문제 기준으로 정리하면 다음과 같습니다.
- 최소 한 문제는 풀어야 하므로
1번 문제는 반드시 풀어야 합니다. 2번 문제를 풀었다면1번 문제도 풀었고, 시간은1번 ≤ 2번이어야 합니다.3번 문제를 풀었다면1번,2번도 모두 풀었고, 시간은1번 ≤ 2번 ≤ 3번이어야 합니다.- 중간 문제를 건너뛰고 풀면 안 되므로,
2번을 안 풀었는데 3번만 푼 경우는 성실한 참여가 아닙니다.
즉 가능한 경우는 다음 셋뿐입니다.
1번만 풂1번, 2번을 순서대로 풂1번, 2번, 3번을 순서대로 풂
각 팀마다 위 조건을 검사해서 성실한 팀이면 개수를 1 증가시키면 됩니다.
코드
#include <stdio.h>
int main() { int n; int answer = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) { int t1, t2, t3; scanf("%d %d %d", &t1, &t2, &t3);
int good = 1;
// 최소 한 문제 해결해야 하므로 1번은 반드시 풀어야 함 if (t1 == -1) { good = 0; }
// 2번을 풀었다면 1번보다 빠를 수 없음 if (t2 != -1 && t1 > t2) { good = 0; }
// 2번을 안 풀었는데 3번을 푼 경우 불가능 if (t2 == -1 && t3 != -1) { good = 0; }
// 3번을 풀었다면 2번보다 빠를 수 없음 if (t3 != -1 && t2 > t3) { good = 0; }
if (good) { answer++; } }
printf("%d\n", answer); return 0;}