山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

[yukicoder] No.714 回転寿司屋のシミュレート

yukicoder contest 195 - C

No.714 回転寿司屋のシミュレート - yukicoder

yukicoder contest 195で出題された問題です。僕は他のことをやっていたので、コンテストには参加しませんでしたが、終了後に解いてみました。

f:id:yamakasa3:20180714013721p:plain

考え方

客席をキー、食べたいものリストを値とするTreeMapを使って解きます。

回転ずしなので、客席の順にお寿司が流れてくることから、キーを辞書順で格納できるTreeMapが適当だと思いました。

あとは、問題文の指示の通りプログラムをつくるだけです。

コード

import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Exec0714 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        Map<Integer, ArrayList<String>> map = new TreeMap<Integer, ArrayList<String>>();
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < N; i++) {
            int t = scan.nextInt();
            if(t == 0) {
                int n = scan.nextInt();
                int m = scan.nextInt();
                ArrayList<String> list = new ArrayList<String>();
                for(int j = 0; j < m; j++) {
                    String s = scan.next();
                    list.add(s);
                }
                map.put(n, list);
            }else if(t == 1) {
                String s = scan.next();
                boolean flag = false;
                for(int j : map.keySet()) {
                    ArrayList<String> list = map.get(j);
                    for(int k = 0; k < list.size(); k++) {
                        if(s.equals(list.get(k))) {
                            list.remove(k);
                            map.put(j, list);
                            sb.append(j).append("\n");
                            flag = true;
                            break;
                        }
                    }
                    if(flag) {
                        break;
                    }
                }
                if(!flag) {
                    sb.append(-1).append("\n");
                }
            }else {
                int n = scan.nextInt();
                map.remove(n);
            }
        }
        scan.close();
        System.out.println(sb.toString());
    }
    static void disp(ArrayList<String> list) {
        for(String s : list) {
            System.out.print(s + " ");
        }
        System.out.println();
    }
}

感想

お寿司が誰にも取られないときのコードが少しへんですが、もっと良い書き方があったと思います。

最初コードを書いたとき、お寿司が誰にも取られない条件をうまく書いていなかったので、不正解となる出力が出てしましました。どうして不正解となるかを調べるために、disp()メソッドを使い間違いを探していたので、disp()メソッドが余計にあります。