0
0

More than 3 years have passed since last update.

AtCoder Programming Guide for beginners (APG4b)のEX25をjavaで書いてみた。

Last updated at Posted at 2019-10-02

はじめに

この記事は、AtCoder内コンテンツの

AtCoder Programming Guide for beginners (APG4b)

で掲載されている課題EX25 - 集合の操作をJavaで記述してみたので、備忘録としてコードを公開するものです。ご一読いただけたら幸いです。

読みづらい点、間違い、感想等ありましたらコメントにてお伝えいただけると嬉しいです。

尚、bit演算子を用いよう!という気概無く、整数値を直接扱っています...(C++でいうところのbitSetが実装されていればよかったのですが。ありますかね…?)

コード

Main.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Integer[] A = new Integer[N];
        for(int i = 0;i < N;i++) {
            A[i] = sc.nextInt();
        }
        int M = sc.nextInt();
        Integer[] B = new Integer[M];
        for(int i = 0;i < M;i++) {
            B[i] = sc.nextInt();
        }
        String command = sc.next();
        int x = 0;
        if(command.equals("subtract")) {
            x = sc.nextInt();
        }
        sc.close();
        switch(command) {
        case "intersection":
            printResult(intersection(A, B));
            break;
        case "union_set":
            printResult(unionset(A, B));
            break;
        case "symmetric_diff":
            printResult(symmetricdiff(A, B));
            break;
        case "subtract":
            printResult(subtract(A, x));
            break;
        case "increment":
            printResult(increment(A));
            break;
        case "decrement":
            printResult(decrement(A));
            break;
        default:
            break;
        }
    }
    /**
     * AとBに共通して含まれる要素からなる集合を返す
     * @param A
     * @param B
     * @return 共通要素の配列
     */
    private static Integer[] intersection(Integer[] A,Integer[] B) {
        List<Integer> Alist = Arrays.asList(A);
        List<Integer> Blist = Arrays.asList(B);
        List<Integer> result = new ArrayList<>();
        for(Integer i : Alist) {
            if(Blist.contains(i)) {
                result.add(i);
            }
        }
        if(result.size()==0) return null;
        Collections.sort(result);
        return  result.toArray(new Integer[result.size()]);
    }

    /**
     * AとBのうち少なくとも一方に含まれる要素からなる集合を返す
     * @param A
     * @param B
     * @return 少なくとも一方に含まれる要素の配列
     */
    private static Integer[] unionset(Integer[] A,Integer[] B) {
        Set<Integer> result = new TreeSet<>(Comparator.naturalOrder());
        for(Integer i : A) result.add(i);
        for(Integer i : B) result.add(i);
        return result.size()==0 ? null : result.toArray(new Integer[result.size()]);
    }

    /**
     * AとBのうちどちらか一方にだけ含まれる要素からなる集合を返す
     * @param A
     * @param B
     * @return 一方にのみ含まれる要素の配列
     */
    private static Integer[] symmetricdiff(Integer[] A,Integer[] B) {
        List<Integer> intersection = Arrays.asList(intersection(A, B));
        List<Integer> union = Arrays.asList(unionset(A, B));
        List<Integer> result = new ArrayList<>();
        for(Integer i : union) {
            if(union.contains(i) && !intersection.contains(i)) {
                result.add(i);
            }
        }
        if(result.size()==0) return null;
        Collections.sort(result);
        return result.toArray(new Integer[result.size()]);
    }

    /**
     * 集合Aから値xを除く
     * @param A
     * @param x
     * @return
     */
    private static Integer[] subtract(Integer[] A, int x) {
        List<Integer> list = Arrays.asList(A);
        List<Integer> result = new ArrayList<>();
        for(Integer i : list) {
            if(i != x) {
                result.add(i);
            }
        }
        if(result.size()==0) return null;
        Collections.sort(result);
        return result.toArray(new Integer[result.size()]);
    }

    /**
     * Aの要素すべてに1を加える。
     */
    private static Integer[] increment(Integer[] A) {
        List<Integer> result = new ArrayList<>();
        for(Integer i : A) {
            i++;
            if(i.equals(50)) {
                i = 0;
            }
            result.add(i);
        }
        if(result.size()==0) return null;
        Collections.sort(result);
        return result.toArray(new Integer[result.size()]);
    }

    /**
     * Aの要素すべてから1を引く。
     */
    private static Integer[] decrement(Integer[] A) {
        List<Integer> result = new ArrayList<>();
        for(Integer i : A) {
            i--;
            if(i.equals(-1)) {
                i = 49;
            }
            result.add(i);
        }
        if(result.size()==0) return null;
        Collections.sort(result);
        return result.toArray(new Integer[result.size()]);
    }

    /**
     * 結果出力
     */
    private static void printResult(Integer[] result) {
        if(result==null) {
            System.out.println("");
            return;
        }
        if(result.length > 1) {
            for(int i = 0;i < result.length-1;i++) {
                System.out.print(result[i] + " ");
            }
        }
        System.out.println(result[result.length-1]);
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0