競プロ典型90問をRustで解いていこう(HashMap)6日目

2022-03-22

はじめに

Rust実装力と、アルゴリズム力を鍛えるために初めたこの典型問題90問をとりあえず簡単なところから解いていくやつも 6日目です。

Rustについては複雑なことさえしなければ書けるようになってきたんじゃないでしょうか。 気のせいかもしれないですが、まぁできる気がするというのは良いことなので今日もやっていきましょう。

本日の問題

競プロ典型90問をRustで解いていこう(準備)0日目

今日は上の記事から5問目である、この問題を解いていきます。 027 - Sign Up Requests (★2)を解いていこうと思います。

027 - Sign Up Requests (★2)

ユーザー登録がされる想定で、重複した文字列が届いた場合は登録に失敗する。 重複していない新規ユーザーは何番目に登録した人かを出力する問題です。

立てた方針

HashMapを使って、すでに登録されている値はSKIPして数え上げればOKと考えました。 Rustには標準で、HashMapが用意されているのでそれを使えばOKです。

Rustでの回答例

最終的には、コード全体がこうなりました。

use proconio::input;
use std::collections::HashSet;

fn main() {
    input! {
        n: usize,
        s: [String;n],
    }
    let mut map = HashSet::new();
    for i in 0..n {
        if !map.contains(&s[i]) {
            println!("{}", i + 1);
            map.insert(s[i].clone());
        }
    }
}

HashSetとHashMapがあるがもとを辿ればどちらも同じHashMapです。 HashSetは、HashMap<T,()>のラッパーとのことです。

ちなみに、HashSetにはKeyがある値を追加しようとすると、上書きされます。

containsを使って指定された文字列がハッシュテーブルにないことを確認して、存在しない場合に番号を出力しています。 map.insertで値をHashMapに詰め込むことができるのですが、Vec配列から添え字を付けて指定した値をそのまま詰め込むことはできないため、cloneして中身を取り出しています。

まとめ

気がつくと、★2の問題は残り1問となりました。 この調子で進めていきたいですね。