From 99d6d9fce91c340422c899667a0e930974e481c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Mon, 8 Aug 2022 13:06:57 +0900 Subject: [PATCH] =?UTF-8?q?B054=20=E4=B8=8D=E6=80=9D=E8=AD=B0=E3=81=AA?= =?UTF-8?q?=E8=B6=B3=E3=81=97=E7=AE=97ver1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/B054_Addition.java | 118 ++++++++++++++++++++++++++++++ knoda/test/B054_AdditionTest.java | 57 +++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 knoda/src/B054_Addition.java create mode 100644 knoda/test/B054_AdditionTest.java diff --git a/knoda/src/B054_Addition.java b/knoda/src/B054_Addition.java new file mode 100644 index 0000000..7707e04 --- /dev/null +++ b/knoda/src/B054_Addition.java @@ -0,0 +1,118 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; + +public class B054_Addition { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final String strAlphabet1 = scan.next(); + final String strAlphabet2 = scan.next(); + + // alphabetList : アルファベット表記で表現している値を格納したリスト + final List alphabetList = new ArrayList(); + alphabetList.add(strAlphabet1); + alphabetList.add(strAlphabet2); + Addition addition = new Addition(); + System.out.println(addition.getCalcResult(alphabetList)); + scan.close(); + } + +} + +class Addition { + // alphabetAndNumber : アルファベットと5進数の対を格納したマップ + private Map alphabetAndNumber = new LinkedHashMap(); + private final int BASE = 5; // 基底の数 + + // 足し算の結果をアルファベットで取得するメソッド + public String getCalcResult(final List alphabetList) { + // アルファベットと5進数の対を格納する + init(); + + // アルファベットを5進数に変換する + final List quinaryNumberList = new ArrayList(); + for (final String strAlphabet : alphabetList) { + String quinaryNumber = ""; + for (int i = 0; i < strAlphabet.length(); i++) { + quinaryNumber += changeFromAlphabetToQuinaryNumber(strAlphabet.charAt(i)); + } + quinaryNumberList.add(quinaryNumber); + } + + // 足し算を行う + int sum = 0; + for (final String quinaryNumber : quinaryNumberList) { + // 5進数を10進数に変換する + sum += changeFromQuinaryToDecimalNumber(quinaryNumber); + } + + // 10進数を5進数に変換する + final String quinaryNumber = changeFromDecimalNumberToQuinaryNumber(sum); + + // 5進数をアルファベットに変換する + String result = ""; + for (int i = 0; i < quinaryNumber.length(); i++) { + result += changeFromQuinaryToAlphabet(quinaryNumber.charAt(i)); + } + return result; + } + + // アルファベットから5進数に変換するメソッド + private char changeFromAlphabetToQuinaryNumber(final char alphabet) { + final Set alphabetSet = alphabetAndNumber.keySet(); + for (Character character : alphabetSet) { + if (character == alphabet) { + return alphabetAndNumber.get(character); + } + } + return 0; + } + + // 5進数から10進数に変換するメソッド + private int changeFromQuinaryToDecimalNumber(final String quinaryNumber) { + int decimalNumber = 0; + for (int i = 0; i < quinaryNumber.length(); i++) { + decimalNumber += Math.pow(BASE, quinaryNumber.length() - i - 1) * Character.getNumericValue(quinaryNumber.charAt(i)); + } + return decimalNumber; + } + + // 10進数から5進数に変換するメソッド + private String changeFromDecimalNumberToQuinaryNumber(int decimalNumber) { + String quinaryNumber = ""; + while (decimalNumber >= BASE) { + int remainder = decimalNumber % BASE; + quinaryNumber += String.valueOf(remainder); + decimalNumber /= BASE; + } + quinaryNumber += String.valueOf(decimalNumber); + StringBuilder strb = new StringBuilder(quinaryNumber); + quinaryNumber = strb.reverse().toString(); + return quinaryNumber; + } + + // 5進数からアルファベットに変換するメソッド + private char changeFromQuinaryToAlphabet(final char alphabet) { + for (Map.Entry entry : alphabetAndNumber.entrySet()) { + if (alphabet == entry.getValue()) { + return entry.getKey(); + } + } + return 0; + } + + // アルファベットと5進数の対を格納するメソッド + private void init() { + alphabetAndNumber.put('A', '0'); + alphabetAndNumber.put('B', '1'); + alphabetAndNumber.put('C', '2'); + alphabetAndNumber.put('D', '3'); + alphabetAndNumber.put('E', '4'); + } +} diff --git a/knoda/test/B054_AdditionTest.java b/knoda/test/B054_AdditionTest.java new file mode 100644 index 0000000..045dac8 --- /dev/null +++ b/knoda/test/B054_AdditionTest.java @@ -0,0 +1,57 @@ +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 B054_AdditionTest { + + @Test + public void AとAを入力したとき出力結果はAになる() { + final List alphabetList = new ArrayList(); + alphabetList.add("A"); + alphabetList.add("A"); + Addition addition = new Addition(); + final String expected = "A"; + final String actual = addition.getCalcResult(alphabetList); + assertThat(actual, is(expected)); + } + + @Test + public void EEEとEEEを入力したとき出力結果はBEEDになる() { + final List alphabetList = new ArrayList(); + alphabetList.add("EEE"); + alphabetList.add("EEE"); + Addition addition = new Addition(); + final String expected = "BEED"; + final String actual = addition.getCalcResult(alphabetList); + assertThat(actual, is(expected)); + } + + @Test + public void EEEとBAAAを入力したとき出力結果はBEEEになる() { + final List alphabetList = new ArrayList(); + alphabetList.add("EEE"); + alphabetList.add("BAAA"); + Addition addition = new Addition(); + final String expected = "BEEE"; + final String actual = addition.getCalcResult(alphabetList); + assertThat(actual, is(expected)); + } + + @Test + public void EEEとBAABを入力したとき出力結果はCAAAになる() { + final List alphabetList = new ArrayList(); + alphabetList.add("EEE"); + alphabetList.add("BAAB"); + Addition addition = new Addition(); + final String expected = "CAAA"; + final String actual = addition.getCalcResult(alphabetList); + assertThat(actual, is(expected)); + } + +} -- GitLab