[C언어] 백준 32859번 - 그런 사람은 없었습니다

매미·2026년 2월 27일

백준

목록 보기
14/15

사지방에서 코딩을 하는 자의 뒷모습은 얼마나 아름다운가

https://www.acmicpc.net/problem/32859

문제

오늘도 평화로운 알로하의 정산 시간이 다가왔다. 재무부장 세영이는
NN명의 회원들에게 돈을 걷어야 한다. 각 회원은 11부터 NN까지 번호가 차례대로 매겨져 있다.
세영이는 올바른 정산을 위하여 회원들에게 입금하기 전에 폼을 제출해 달라고 전달했다. 하지만, 어떤 회원들은 폼만 작성하거나, 입금만 하거나, 입금을 먼저 하고 폼을 제출하기도 했다. 입금한 시점 이후 다른 SS명이 폼을 제출한 후에도 폼을 제출하지 않은 회원은 폼 제출을 잊었다고 판단한다.
세영이는 폼 제출을 잊은 회원을 모두 찾아 확인 연락을 보내야 한다. 세영이를 도와 폼 제출을 잊은 회원의 번호를 모두 출력하는 프로그램을 작성해 주자. 단, 두 번 이상 폼을 제출하거나 두 번 이상 입금한 회원은 없으며, 폼 제출 또는 입금이 동시에 여러 번 발생하는 경우는 없다.

입력

첫째 줄에 회원의 수 NN과 일어나는 사건의 수 MM이 공백으로 구분되어 주어진다. 사건은 폼 제출 또는 입금을 의미한다. (1≤N≤2 000;(1\leq N\leq 2\, 000; 1≤M≤N×2)1\leq M\leq N\times 2) 
둘째 줄에 정수 SS가 주어진다. (1≤S≤N)(1\leq S\leq N) 
셋째 줄부터 MM개의 줄에 걸쳐 각 사건을 설명하는 두 정수 ii, tt가 공백으로 구분되어 주어진다.
t=0t=0이라면 ii번 회원이 폼을 제출했다는 의미이며,
t=1t=1이라면 ii번 회원이 입금했다는 의미이다. 사건은 발생한 순서대로 주어진다.
(1≤i≤N;(1\le i\le N; t∈{0,1})t\in\{0,1\} ) 

출력

첫째 줄부터 폼 제출을 잊은 회원의 번호를 한 줄에 하나씩 오름차순으로 모두 출력한다.
폼 제출을 잊은 회원이 없다면 첫째 줄에 -1만을 출력한다.

발상


2xN 2차원 배열을 만들었다.
첫 번째 행은 입금여부(입금 X = 0, 입금 O = 1), 두 번째 행은 첫 입금 후 폼 제출까지의 폼 제출 카운트를 의미한다.

만약 A가 입금한 후, A가 폼을 제출하기 전까지 다른 사람이 제출한 폼 개수가 S번 미만이면 A의 cnt를 -1로 바꿔주었다.
또한 A가 입금을 하지 않은 상태에서, 폼 제출을 먼저 한 상황에서도 A의 cnt를 -1로 바꿔주었다.

누군가 폼을 제출한 경우, 배열의 전체를 둘러보며, 입금은 했지만 폼 제출을 안 한 사람이 있으면 그 사람의 cnt를 1씩 늘려주었다.

Clang

#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;
}
profile
Kwangwoon Univ. Computer Information and Engineering 24

0개의 댓글