佐藤のメモ帳

Rust, Python, Java, AWS, etc...

HackerRank; Sales By Match(Java8)

問題

同じ色の靴下のペア数を返却する関数を作成する問題。

www.hackerrank.com

回答

※注意
別解の方がスマート。

昇順ソートした入力arの先頭から靴下のペアを探索する。
添字と添字+1の要素が同じであればペアとみなし、添字を+2する。
ペアじゃなければ、添字を+1する。

public static int sockMerchant(int n, List<Integer> ar) {
    int count = 0;
    Collections.sort(ar);
    for(int i=0;i<=n-2;){
        if(ar.get(i) == ar.get(i+1)){
            count++;
            i += 2;
        }else{
            i++;
        }
    }
    return count;
}

別解

こちらの方がスマート。
色毎に靴下の数を数え、結果を配列に格納する。
配列の要素数/2の合計がペア数となる。

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    int[] freq = new int[101];
    int n = s.nextInt();
    for(int i = 0; i < n; i++){
        int x = s.nextInt();
        freq[x]++;
    }
    int total = 0;
    for(int i = 1; i < 101; i++){
        total+=freq[i]/2;
    }
    System.out.println(total);
}