diff --git a/knoda/src/B050_Ticket.java b/knoda/src/B050_Ticket.java new file mode 100644 index 0000000000000000000000000000000000000000..a16c6f2ccc56860343b566f3becb2a2d593d8445 --- /dev/null +++ b/knoda/src/B050_Ticket.java @@ -0,0 +1,98 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B050_Ticket { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + + final int ticketNum = scan.nextInt(); + final String keyword = scan.next(); + + // ticketStringList : すべてのチケットが格納されているリスト + final List ticketStringList = new ArrayList(); + // チケットの文字列を入力する + for (int i = 0; i < ticketNum; i++) { + ticketStringList.add(scan.next()); + } + + final TicketList ticketList = new TicketList(); + // validAndInvalidList : チケットが有効か無効かを格納するリスト + // チケットが有効かどうかを取得する + final List validAndInvalidList = ticketList.getIsTicketValid(keyword, ticketStringList); + for (final String result : validAndInvalidList) { + System.out.println(result); + } + scan.close(); + } + +} + +// チケットクラス +class TicketList { + + // チケットが有効かどうかを取得するメソッド + public List getIsTicketValid(final String keyword, final List ticketStringList) { + // validAndInvalidList : チケットが有効か無効かを格納するリスト + final List validAndInvalidList = new ArrayList(); + // それぞれのチケットが有効かどうかを調べる + for (final String ticketString : ticketStringList) { + boolean isValid = false; // チケットが有効かを判定 + + // チケットの1文字目から調べる + for (int startIndex = 0; startIndex < ticketString.length() - keyword.length() + 1; startIndex++) { + final int keywordIndex = 0; + final int ticketStringIndex = startIndex; + final int extraCharCount = 0; + + // チケットの文字列を走査する + isValid = characterTraversal(keywordIndex, ticketStringIndex, extraCharCount, ticketString, keyword); + + // 有効なチケットのとき + if (isValid) { + break; + } + } + + // チケットが有効か無効かを格納する + if (isValid) { + validAndInvalidList.add("valid"); + } else { + validAndInvalidList.add("invalid"); + } + } + return validAndInvalidList; + } + + // チケットの文字列を走査するメソッド + private boolean characterTraversal(int keywordIndex, int ticketStringIndex, int extraCharCount, + final String ticketString, final String keyword) { + // チケットの文字列が1文字目から間違っている、もしくは余計な文字がすでに1文字含まれていたらループから抜ける + while (ticketStringIndex < ticketString.length()) { + if (ticketString.charAt(ticketStringIndex) == keyword.charAt(keywordIndex)) { + // 指定した文字列の文字とチケットの文字列の文字が同じとき + keywordIndex++; + // 有効なチケットのとき、validを格納する + if (keyword.length() == keywordIndex) { + return true; + } + + } else if ((keywordIndex > 0) && (extraCharCount == 0)) { + // チケットの文字列に余計な文字が存在していないとき + extraCharCount++; + } else if (keywordIndex > 0) { + // チケットの文字列に余計な文字がすでに1文字存在しているとき + break; + } else { + // チケットの文字列が1文字目から間違っているとき + break; + } + ticketStringIndex++; + } + return false; + } + +} \ No newline at end of file diff --git a/knoda/test/B050_TicketTest.java b/knoda/test/B050_TicketTest.java new file mode 100644 index 0000000000000000000000000000000000000000..80ec2b13a965abcb5df49e37b2fd4af71e718e1f --- /dev/null +++ b/knoda/test/B050_TicketTest.java @@ -0,0 +1,117 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class B050_TicketTest { + + @Test + public void テスト1() { + String keyword = "paiza"; + List ticketStringList = new ArrayList(); + + ticketStringList.add("sdfpaizaoiu"); + ticketStringList.add("sdfpaizoiu"); + ticketStringList.add("paxiza"); + ticketStringList.add("paxizya"); + ticketStringList.add("ghepaizmakbn"); + ticketStringList.add("paizzza"); + ticketStringList.add("abcpadizzzaopq"); + + TicketList ticketList = new TicketList(); + List actualList = ticketList.getIsTicketValid(keyword, ticketStringList); + List expectedList = new ArrayList(); + + expectedList.add("valid"); + expectedList.add("invalid"); + expectedList.add("valid"); + expectedList.add("invalid"); + expectedList.add("valid"); + expectedList.add("invalid"); + expectedList.add("invalid"); + + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + + @Test + public void テスト2() { + String keyword = "gbyw"; + List ticketStringList = new ArrayList(); + + ticketStringList.add("gbyw"); + ticketStringList.add("ggbyw"); + ticketStringList.add("gbyws"); + ticketStringList.add("b"); + ticketStringList.add("kwflzgltejlcaosivfsy"); + ticketStringList.add("gbyl"); + ticketStringList.add("ogbyw"); + ticketStringList.add("ejyt"); + ticketStringList.add("yjlih"); + ticketStringList.add("bzbrquhbujsxnnoxfsw"); + ticketStringList.add("ygowvgibywkw"); + + TicketList ticketList = new TicketList(); + List actualList = ticketList.getIsTicketValid(keyword, ticketStringList); + List expectedList = new ArrayList(); + + expectedList.add("valid"); + expectedList.add("valid"); + expectedList.add("valid"); + expectedList.add("invalid"); + expectedList.add("invalid"); + expectedList.add("invalid"); + expectedList.add("valid"); + expectedList.add("invalid"); + expectedList.add("invalid"); + expectedList.add("invalid"); + expectedList.add("valid"); + + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + + @Test + public void 指定された文字列に1文字余計な文字が入った場合はvalid() { + String keyword = "aaaaa"; + List ticketStringList = new ArrayList(); + + ticketStringList.add("aaabbabcabaaaa"); + + TicketList ticketList = new TicketList(); + List actualList = ticketList.getIsTicketValid(keyword, ticketStringList); + List expectedList = new ArrayList(); + + expectedList.add("valid"); + + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + + @Test + public void 指定された文字列に2文字余計な文字が入った場合はinvalid() { + String keyword = "aaaaa"; + List ticketStringList = new ArrayList(); + + ticketStringList.add("aaabbaacbaaababaa"); + + TicketList ticketList = new TicketList(); + List actualList = ticketList.getIsTicketValid(keyword, ticketStringList); + List expectedList = new ArrayList(); + + expectedList.add("invalid"); + + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + +}