사지방에서 코딩을 하는 자의 뒷모습은 얼마나 아름다운가
오늘도 평화로운 알로하의 정산 시간이 다가왔다. 재무부장 세영이는
명의 회원들에게 돈을 걷어야 한다. 각 회원은 부터 까지 번호가 차례대로 매겨져 있다.
세영이는 올바른 정산을 위하여 회원들에게 입금하기 전에 폼을 제출해 달라고 전달했다. 하지만, 어떤 회원들은 폼만 작성하거나, 입금만 하거나, 입금을 먼저 하고 폼을 제출하기도 했다. 입금한 시점 이후 다른 명이 폼을 제출한 후에도 폼을 제출하지 않은 회원은 폼 제출을 잊었다고 판단한다.
세영이는 폼 제출을 잊은 회원을 모두 찾아 확인 연락을 보내야 한다. 세영이를 도와 폼 제출을 잊은 회원의 번호를 모두 출력하는 프로그램을 작성해 주자. 단, 두 번 이상 폼을 제출하거나 두 번 이상 입금한 회원은 없으며, 폼 제출 또는 입금이 동시에 여러 번 발생하는 경우는 없다.
첫째 줄에 회원의 수 과 일어나는 사건의 수 이 공백으로 구분되어 주어진다. 사건은 폼 제출 또는 입금을 의미한다.
둘째 줄에 정수 가 주어진다.
셋째 줄부터 개의 줄에 걸쳐 각 사건을 설명하는 두 정수 , 가 공백으로 구분되어 주어진다.
이라면 번 회원이 폼을 제출했다는 의미이며,
이라면 번 회원이 입금했다는 의미이다. 사건은 발생한 순서대로 주어진다.
첫째 줄부터 폼 제출을 잊은 회원의 번호를 한 줄에 하나씩 오름차순으로 모두 출력한다.
폼 제출을 잊은 회원이 없다면 첫째 줄에 -1만을 출력한다.

2xN 2차원 배열을 만들었다.
첫 번째 행은 입금여부(입금 X = 0, 입금 O = 1), 두 번째 행은 첫 입금 후 폼 제출까지의 폼 제출 카운트를 의미한다.
만약 A가 입금한 후, A가 폼을 제출하기 전까지 다른 사람이 제출한 폼 개수가 S번 미만이면 A의 cnt를 -1로 바꿔주었다.
또한 A가 입금을 하지 않은 상태에서, 폼 제출을 먼저 한 상황에서도 A의 cnt를 -1로 바꿔주었다.
누군가 폼을 제출한 경우, 배열의 전체를 둘러보며, 입금은 했지만 폼 제출을 안 한 사람이 있으면 그 사람의 cnt를 1씩 늘려주었다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int N, M, S;
scanf("%d %d", &N, &M);
scanf("%d", &S);
int** arr = (int**)malloc(sizeof(int*)*2);
for (int i=0; i<2; i++) {
arr[i] = (int*)calloc(N, sizeof(int));
}
for (int j=0; j<M; j++) {
int i, t;
scanf("%d %d", &i, &t);
if (t == 0) { // 폼 제출
if (arr[0][i-1] == 0 || (arr[0][i-1] == 1 && arr[1][i-1] < S)) {
arr[1][i-1] = -1;
}
for (int k=0; k<N; k++) {
if (arr[0][k] == 1 && arr[1][k] != -1) arr[1][k]++;
}
} else { // 입금
arr[0][i-1] = 1;
}
}
int flag = 0;
for (int j=0; j<N; j++) {
if (arr[1][j] >= S) {
printf("%d\n", j+1);
flag = 1;
}
}
if (!flag) printf("%d", -1);
for (int i = 0; i < 2; i++) {
free(arr[i]);
}
free(arr);
return 0;
}