diff --git a/knoda/src/B114_SportsDay.java b/knoda/src/B114_SportsDay.java new file mode 100644 index 0000000000000000000000000000000000000000..66cd21da10b5c27042ab7c0a49c005a85de5aa78 --- /dev/null +++ b/knoda/src/B114_SportsDay.java @@ -0,0 +1,130 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Scanner; + +public class B114_SportsDay { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + /* + * playerNum : プレイヤーの人数 + * playNum : 試技回数 + */ + int playerNum = scan.nextInt(); + int playNum = scan.nextInt(); + + /* + * playerList : すべてのプレイヤーの記録を格納したリスト + * recordList : あるプレイヤーの記録を格納したリスト + */ + // すべてのプレイヤーの記録を入力する + final List> playerList = new ArrayList>(); + for (int player = 0; player < playerNum; player++) { + final List recordList = new ArrayList(); + for (int play = 0; play < playNum; play++) { + recordList.add(scan.nextInt()); + } + playerList.add(recordList); + } + + /* + * bestPlayerList : 最も良い記録を出したプレイヤーを格納したリスト + */ + SportsDay sportsDay = new SportsDay(); + // 最も良い記録を出したプレイヤーたちを取得する + final List bestPlayerList = sportsDay.getBestPlayer(playerList, playNum); + for (Integer player : bestPlayerList) { + // 出力の関係上、playerの値に1を足す + System.out.println(player + 1); + } + scan.close(); + } + +} + +// 運動会クラス +class SportsDay { + /* + * bestPlayerList : 最も良い記録を出したプレイヤーを格納したリスト + * INITIAL_VALUE : 初期値 + */ + private final List bestPlayerList = new ArrayList(); + private static final int INITIAL_VALUE = 0; + + // 最も良い記録を出したプレイヤーたちを取得するメソッド + public List getBestPlayer(final List> playerList, final int playNum) { + /* + * sortRecordList : プレイヤーごとの記録を降順に並び変えたリスト + */ + final List> sortRecordList = new ArrayList>(); + for (List recordList : playerList) { + // Collections.sort(recordList, new SortList()); // Comparatorを使用したとき + + // Collections.sortとCollections.reverseを使用したとき + Collections.sort(recordList); + Collections.reverse(recordList); + sortRecordList.add(recordList); + } + /* + * play : 試技 + * playBestPlayer : k番目にいい記録を出したプレイヤーたち(bestPlayerList)の中で、最も良い記録のプレイヤー + */ + int play = INITIAL_VALUE; + int playBestPlayer = INITIAL_VALUE; + + // 最も良い記録を出したプレイヤーを初期化する + setUp(playerList.size()); + + // 最も良い記録を出したプレイヤーが1人、もしくは試技回数に達するまで繰り返す + while ((bestPlayerList.size() != 1) && (play < playNum)) { + /* + * playBestRecord : k番目にいい記録を出したプレイヤーたち(bestPlayerList)の中で、最も良い記録 + * notBestPlayerList : k番目にいい記録を出したプレイヤーたち(bestPlayerList)の中で、1番に良い記録でなかったプレイヤーを格納したリスト + */ + int playBestRecord = sortRecordList.get(bestPlayerList.get(INITIAL_VALUE)).get(play); + final List notBestPlayerList = new ArrayList(); + + // k番目にいい記録を出したプレイヤーたち(bestPlayerList)の中で、最も良い記録を出したプレイヤーを算出する + for (Integer player : bestPlayerList) { + if (playBestRecord < sortRecordList.get(player).get(play)) { + playBestRecord = sortRecordList.get(player).get(play); + notBestPlayerList.add(playBestPlayer); + playBestPlayer = player; + } else if (playBestRecord > sortRecordList.get(player).get(play)) { + notBestPlayerList.add(player); + } + } + + // 1番に良い記録でなかったプレイヤーを削除する + for (Integer player : notBestPlayerList) { + bestPlayerList.remove(player); + } + play++; + } + return bestPlayerList; + } + + // 最も良い記録を出したプレイヤーを初期化するメソッド + private void setUp(final int playerNum) { + for (int player = 0; player < playerNum; player++) { + bestPlayerList.add(player); + } + } +} + +// リストを降順にソートするクラス + +class SortList implements Comparator { + + @Override + public int compare(Integer record1, Integer record2) { + return record2 - record1; + } +} + + diff --git a/knoda/test/B114_SportsDayTest.java b/knoda/test/B114_SportsDayTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d5297300136dbc5305721a6c0ced3d7bcff84876 --- /dev/null +++ b/knoda/test/B114_SportsDayTest.java @@ -0,0 +1,46 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +public class B114_SportsDayTest { + List> playerList; + SportsDay sut; + + @Test + public void 最も良い記録を出したプレイヤーが1人のとき() { + playerList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(400, 450, 420)), + new ArrayList(Arrays.asList(500, 400, 410)), + new ArrayList(Arrays.asList(490, 500, 490)) + )); + sut = new SportsDay(); + + int expected = 3; + List actualList = sut.getBestPlayer(playerList); + assertThat(actualList.get(0) + 1, is(expected)); + } + + @Test + public void 最も良い記録を出したプレイヤーが複数のとき() { + playerList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(300, 310, 440, 430)), + new ArrayList(Arrays.asList(410, 420, 430, 440)), + new ArrayList(Arrays.asList(430, 420, 440, 410)) + )); + sut = new SportsDay(); + + List expectedList = new ArrayList(Arrays.asList(2, 3)); + List actualList = sut.getBestPlayer(playerList); + for (int i = 0; i < expectedList.size(); i++) { + assertThat(actualList.get(i) + 1, is(expectedList.get(i))); + } + } + +}