diff --git a/knoda/src/B079_CompatibilityCheck.java b/knoda/src/B079_CompatibilityCheck.java new file mode 100644 index 0000000000000000000000000000000000000000..b2a0c8b05c2bfa2694cc5d85f79468b150d45f67 --- /dev/null +++ b/knoda/src/B079_CompatibilityCheck.java @@ -0,0 +1,63 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B079_CompatibilityCheck { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final String name1 = scan.next(); + final String name2 = scan.next(); + final CompatibilityCheck compatibilityCheck = new CompatibilityCheck(); + // 2人の相性を取得する + final int compatibilityDegree = compatibilityCheck.getCompatibilityDegree(name1, name2); + System.out.println(compatibilityDegree); + scan.close(); + } + +} + +class CompatibilityCheck { + private final int MAX_NUMBER = 101; // numberListの要素の最大値 + + /** + * 2人の相性を取得するメソッド + * @param name1 : 名前 + * @param name2 : 名前 + * @return Math.max(compatibilityDegree1, compatibilityDegree2) : 2人の相性 + */ + public int getCompatibilityDegree(final String name1, final String name2) { + final int compatibilityDegree1 = calcCompatibilityDegree(name1 + name2); + final int compatibilityDegree2 = calcCompatibilityDegree(name2 + name1); + + return Math.max(compatibilityDegree1, compatibilityDegree2); + } + + /** + * 2人の相性を算出するメソッド + * @param concatName : 2人の名前を連結した文字列 + * @return numberList.get(0) : 2人の相性 + */ + private int calcCompatibilityDegree(final String concatName) { + final List numberList = new ArrayList(); + + // 文字を数字に変換する + for (int i = 0; i < concatName.length(); i++) { + numberList.add(concatName.charAt(i) - 'a' + 1); + } + + // 2人の相性を算出する + while (numberList.size() > 1) { + for (int i = 0; i < numberList.size() - 1; i++) { + numberList.set(i, numberList.get(i) + numberList.get(i + 1)); + if (numberList.get(i) > MAX_NUMBER) { + numberList.set(i, numberList.get(i) - MAX_NUMBER); + } + } + numberList.remove(numberList.size() - 1); + } + return numberList.get(0); + } +} diff --git a/knoda/test/B079_CompatibilityCheckTest.java b/knoda/test/B079_CompatibilityCheckTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a78d8a5c2e7715616923e2b768aa9879c85c1073 --- /dev/null +++ b/knoda/test/B079_CompatibilityCheckTest.java @@ -0,0 +1,58 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * @author knoda + * + */ +public class B079_CompatibilityCheckTest { + + @Test + public void 名前がそれぞれa_bのとき3が出力されるテスト() { + final String name1 = "a"; + final String name2 = "b"; + final CompatibilityCheck compatibilityCheck = new CompatibilityCheck(); + final int expected = 3; + final int actual = compatibilityCheck.getCompatibilityDegree(name1, name2); + assertThat(actual, is(expected)); + } + + + @Test + public void 名前がそれぞれ1000文字のときのテスト() { + String name1 = ""; + String name2 = ""; + for (int i = 0; i < 1000; i++) { + name1 += "a"; + } + for (int i = 0; i < 1000; i++) { + name2 += "b"; + } + final CompatibilityCheck compatibilityCheck = new CompatibilityCheck(); + final int expected = 26; + final int actual = compatibilityCheck.getCompatibilityDegree(name1, name2); + assertThat(actual, is(expected)); + } + + + /** + * 名前の順序を入れ替えても相性の大きい方が出力される + * つまり、出力される値は変わらない + */ + @Test + public void pa_izaと入力してもiza_paと入力してもともに83と出力されるテスト() { + final String name1 = "pa"; + final String name2 = "iza"; + final CompatibilityCheck compatibilityCheck = new CompatibilityCheck(); + final int expected = 83; + int actual1 = compatibilityCheck.getCompatibilityDegree(name1, name2); + assertThat(actual1, is(expected)); + + int actual2 = compatibilityCheck.getCompatibilityDegree(name2, name1); + assertThat(actual1, is(actual2)); + } +}