寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による集合と要素の個数

C言語による集合と要素の個数です。
自然数の集合から、後述の条件を少なくとも一つ満たす人数を割り出すプログラムです。

・問題
 秘密の組織アイヅアナリティクス(AiZu AnalyticS)は、極秘の調査を開始した。
 ターゲットになっている人物は N 人いて、1 から N の識別番号が付けられている。
 AZAS 情報戦略調査員であるあなたは、 ターゲットの中から、以下の条件を少なくとも一つ満たす人物の数を割り出すことにした。
   組織 A に属さず、かつ、商品 C を所持している者。
   組織 B に属し、かつ、商品 C を所持している者。
 組織 A に属している者、組織 B に属している者、商品 C を所持している者の識別番号が入力として与えられたとき、条件を満たす人物の数を割り出すプログラムを作成せよ。
 ただし、どちらの条件も満たす人物を重複して数えないように注意せよ。
 (補足:上記の条件について)
 1 から N までの自然数の集合から、いくつかの要素を選んだ集合を A,B,C とする。
 条件を満たす人物の数は、
f:id:neguse_atama:20200322014940p:plain
  (図の塗られた部分) を満たす要素の個数である。
f:id:neguse_atama:20200322014917p:plain
・入力される値
 入力は以下の形式で与えられる。
   N
   X a1 a2 ... aX
   Y b1 b2 ... bY
   Z c1 c2 ... cZ
 入力は4行であり、1行目に調査対象の人数 N (1 ≤ N ≤ 100) が与えられる。
 2行目に、組織 A に属している者の数 X (0 ≤ X ≤ N)と、それに続いて組織 A に属している者の識別番号 ai (1 ≤ ai ≤ N) が与えられる。
 3行目に、組織 B に属している者の数 Y (0 ≤ Y ≤ N) と、それに続いて組織 B に属している者の識別番号 bi (1 ≤ bi ≤ N) が与えられる。
 4行目に、商品 C を所持している者の数 Z (0 ≤ Z ≤ N) と、それに続いて商品 C を所持している者の識別番号 ci (1 ≤ ci ≤ N) が与えられる。

・期待する出力
 条件を満たす人物の数を1行に出力する。

僕が作成、提出したコードは、以下のとおりです。

/*
 Problem Set from Volume2 0238 : Time to Study
 http://judge.u-aizu.ac.jp/
 C言語による集合と要素の個数
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int k[100];
int main(void){
    int n,i;
    int num=0;
    scanf("%d",&n);
    while(n--){
        k[n]=1;
    }
    scanf("%d",&n);
    while(n--){
        scanf("%d",&i);
        k[i-1]=0;
    }
    scanf("%d",&n);
    while(n--){
        scanf("%d",&i);
        k[i-1]=1;
    }
    scanf("%d",&n);
    while(n--){
        scanf("%d",&i);
        if(k[i-1]){
            num++;
        }
    }
    printf("%d\n",num);
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
Problem Set from Volume3 0318 : Secret Investigation