[Java]伯俊1013号[Contact]Java


白俊1013号です.
https://www.acmicpc.net/problem/1013

質問する


伝播の基本単位は,{0,1},x+()が任意の数(少なくとも1つ)xの繰返しからなる伝播の集合を表す2つの構成からなる.

  • (100 | 11)+ = { 100 , 11 , 10011 , 11100 , 1110011100 , 100111111100100, … }

  • (100+1+ | 01)+
  • 金ドンヒョク博士は、様々な伝播記録から、このようなパターンを持つ伝播プログラムを見つける必要がある.この操作を実行できるプログラムを作成します.

    入力


    入力された第1行は、試験例の個数Tを与える.次の行から、各テストケースについて、伝播を表す{0,1}のみを含む文字列にスペースはありません.文字列長は(1≦N≦200)です.

    しゅつりょく


    各テストケースについて,与えられた伝播パターンが問題で提案されたパターンであり,「YES」でなければ「NO」が出力される.出力文字列はすべて大文字で構成されています.

    入力例1

    3
    10010111
    011000100110001
    0110001011001

    サンプル出力1

    NO
    NO
    YES

    考える


    この問題は正規表現の概念に関連している.
    私は正規表現についてよく知らないので、書くたびに検索して解きます.
    この問題はなんと簡単なことか...
    質問に出した"(100+1+ | 01)+"パターンをそのまま入れるだけで正解を出力できます.
    ゴールド問題なので難しいかと思いましたが、正規表現自体がちょっと難しいのは、高すぎるせいかもしれません.

    アクション


    regexは、正規表現で作成されたパターンと文字列を比較するために使用されます.Patternを使用する必要があります.Pattern P = Pattern.compile("(100+1+|01)+");口を通って
    私たちが使用するモードを定数にコンパイルしておきます.
    matcherのmatches関数を用いて比較し,ブール値と判別した.

    TMI


    1.残念ながらアレシボ天文台は2020年に崩壊し引退を余儀なくされた.
    2.映画交流の中で、主人公が外星の信号を研究している間に追い出された場所は、アレシボが満員になった場所だった.だからこの問題のテーマは接触です.(1行目は名セリフ)

    コード#コード#

    import java.util.regex.Pattern;
    import java.io.*;
    
    public class Main {
    	private static final Pattern P = Pattern.compile("(100+1+|01)+");
    
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringBuilder sb = new StringBuilder();
    		
    		int T = Integer.parseInt(br.readLine());
    		
    		while(T-- > 0) {
    
                if (P.matcher(br.readLine()).matches()) {
                    sb.append("YES").append('\n');
                } else {
                    sb.append("NO").append('\n');
                }
    		}
    		
    		System.out.println(sb);
    
    	} // End of main
    } // End of class