문제
위병소에서 근무하는 헌병은 오늘 근무를 끝마치고 보안 점검을 위해 출입 기록을 살펴보던 중, 오늘 출입 기록의 일부가 누락되었다는 사실을 깨달았다!
오늘 기록된 출입 기록은 총 N개이며, 출입 기록은 반드시 출입자가 출입한 시간순으로 기록된다.
I번째 출입 기록은 두 개의 정수 a(i),b(i)로 기록되는데, a(i)는 출입하는 사람의 번호를 의미하며,b(i)가 1이면 부대로 들어갔다는 뜻이고 b(i)가 0이면 부대에서 나왔다는 뜻이다. 또한, 출입 기록을 시작하기 전과 출입 기록을 끝낸 후에는 부대 내에 아무도 없었다고 한다.
오늘의 출입 기록을 토대로 오늘 하루동안 누락된 출입 기록의 최소 개수를 구하여라.
조건 및 입출력
- 첫 번째 줄에 출입 기록의 개수 N이 주어진다. (1≤N≤200000)
두 번째 줄부터 N+1번째 줄까지, i번째 출입 기록을 나타내는 정수 a(i)와 b(i)가 공백으로 구분되어 주어진다. (1≤a(i)≤200000; 0≤b(i)≤1)
- 오늘 하루 동안 누락된 출입 기록의 최소 개수를 출력한다.
- 시간 제한: 1초 / 메모리 제한: 1024MB
코드(C99)
#include <stdio.h>
#include <stdbool.h>
//전역변수 선언부
bool log[200001] = { false };
main()
{
int test;
scanf("%d", &test);
int mistake = 0, last_in = -999;
for (int i = 0; i < test; i++)
{
int person, in_out;
scanf("%d %d", &person, &in_out);
last_in = last_in < person ? person : last_in;
if (in_out == false)
{
if (!log[person])
mistake++;
else
log[person] = false;
}
else
{
if (log[person])
mistake++;
else
log[person] = true;
}
}
for (int i = 1; i <= last_in; i++)
if (log[i])
mistake++;
printf("%d", mistake);
return 0;
}
여담
난 학교에서 C를 배울 떄, 자료형에 bool이 없다고 배운 것 같은데..
그래서 여태 enum이나 define으로 TRUE, FALSE를 정의해서 썼다.
그런데, 오늘 정답을 제출하고 다른 사람 코드를 보니 bool 형이 있다는 것을 알게 되었다...
도대체 난 뭘 배운 것인가...
'Programming > C언어' 카테고리의 다른 글
| [백준] 23028번 : 5학년은 다니기 싫어요 (C언어 / C99) (0) | 2023.09.09 |
|---|---|
| [백준] 20551번 : Sort 마스터 배지훈의 후계자 (C언어 / C99) (0) | 2023.09.02 |
| [백준] 10804번 : 카드 역배치 (C언어 / C99) (0) | 2023.09.01 |
| [백준] 14720번 : 우유 축제 (C언어 / C99) (0) | 2023.08.26 |
| [백준] 3036번 : 링 (C언어 / C99) (0) | 2023.08.23 |