diff --git a/ykoiso/src/B095_Sing.java b/ykoiso/src/B095_Sing.java new file mode 100644 index 0000000000000000000000000000000000000000..1530c67abd1e2aac626a18e5683ce3ae88a623fe --- /dev/null +++ b/ykoiso/src/B095_Sing.java @@ -0,0 +1,86 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Scanner; + +public class B095_Sing { + static final int EXCELLENT = 5; + static final int GREAT = 10; + static final int VERY_GOOD = 20; + static final int GOOD = 30; + static final int BAD = 99; + // 離れたピッチ数と減点する値のマップ + private static Map minusScoreMap = new HashMap<>(); + static { + minusScoreMap.put(EXCELLENT, 0); + minusScoreMap.put(GREAT, 1); + minusScoreMap.put(VERY_GOOD, 2); + minusScoreMap.put(GOOD, 3); + minusScoreMap.put(BAD, 5); + } + + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + // 定数の読み込み + final int MEMBER_NUM = scan.nextInt(); + final int SONG_LENGTH = scan.nextInt(); + // 各人のスコア + List score = new ArrayList<>(); + // 正しいピッチ + List correctPitch = new ArrayList<>(); + for (int i = 0; i < SONG_LENGTH; i++) { + correctPitch.add(scan.nextInt()); + } + // 各人のピッチ + List> menberPitch = new ArrayList<>(); + for (int i = 0; i < MEMBER_NUM; i++) { + menberPitch.add(new ArrayList<>()); + } + for (int member = 0; member < MEMBER_NUM; member++) { + for (int i = 0; i < SONG_LENGTH; i++) { + menberPitch.get(member).add(scan.nextInt()); + } + } + // 各人のスコアの計算 + for (int member = 0; member < MEMBER_NUM; member++) { + score.add(calcSongScore(menberPitch.get(member), correctPitch)); + } + // 結果の出力 + System.out.println(max(score)); + scan.close(); + } + + // リストの最大値 + public static int max(final List list) { + int max = 0; + for (int i = 0; i < list.size(); i++) { + if (list.get(i) > max) + max = list.get(i); + } + return max; + } + + // スコアの計算 + public static int calcSongScore(final List menberPitch, + final List correctPitch) { + int score = 100; + for (int i = 0; i < correctPitch.size(); i++) { + // ずれたピッチの絶対値の計算 + int abs = Math.abs(correctPitch.get(i) - menberPitch.get(i)); + // スコアの減点 + if (abs <= EXCELLENT) { + } else if (abs <= GREAT) { + score -= minusScoreMap.get(GREAT); + } else if (abs <= VERY_GOOD) { + score -= minusScoreMap.get(VERY_GOOD); + } else if (abs <= GOOD) { + score -= minusScoreMap.get(GOOD); + } else { + score -= minusScoreMap.get(BAD); + } + } + return score; + } +} diff --git a/ykoiso/test/B095_SingTest.java b/ykoiso/test/B095_SingTest.java new file mode 100644 index 0000000000000000000000000000000000000000..62afebe5c593fb5ac93664880976484ecce9d93e --- /dev/null +++ b/ykoiso/test/B095_SingTest.java @@ -0,0 +1,57 @@ +import static org.junit.Assert.assertThat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.*; + +public class B095_SingTest { + B095_Sing sut; + List correctPitch, menberPitch; + + @Before + public void setUp() { + correctPitch = new ArrayList<>(Arrays.asList(100, 100, 100)); + } + + @Test + public void EXCELLENTを出したとき() { + int expected = 100; + menberPitch = new ArrayList<>(Arrays.asList(100, 95, 105)); + int actual = sut.calcSongScore(menberPitch, correctPitch); + assertThat(actual, is(expected)); + } + + @Test + public void GREATを出したとき() { + int expected = 97; + menberPitch = new ArrayList<>(Arrays.asList(106, 94, 110)); + int actual = sut.calcSongScore(menberPitch, correctPitch); + assertThat(actual, is(expected)); + } + + @Test + public void VERY_GOODを出したとき() { + int expected = 94; + menberPitch = new ArrayList<>(Arrays.asList(111, 85, 120)); + int actual = sut.calcSongScore(menberPitch, correctPitch); + assertThat(actual, is(expected)); + } + + @Test + public void GOODを出したとき() { + int expected = 91; + menberPitch = new ArrayList<>(Arrays.asList(121, 75, 130)); + int actual = sut.calcSongScore(menberPitch, correctPitch); + assertThat(actual, is(expected)); + } + + @Test + public void BADを出したとき() { + int expected = 85; + menberPitch = new ArrayList<>(Arrays.asList(131, 0, 999)); + int actual = sut.calcSongScore(menberPitch, correctPitch); + assertThat(actual, is(expected)); + } +}