From 82f9e6f811727a2b20bf2f88351cc505cabfc1a7 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, 1 Aug 2022 13:38:51 +0900 Subject: [PATCH 1/4] =?UTF-8?q?B074=20=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E9=A0=86=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/B074_CommentSequence.java | 109 +++++++++++++++++++++++ knoda/test/B074_CommentSequenceTest.java | 65 ++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 knoda/src/B074_CommentSequence.java create mode 100644 knoda/test/B074_CommentSequenceTest.java diff --git a/knoda/src/B074_CommentSequence.java b/knoda/src/B074_CommentSequence.java new file mode 100644 index 0000000..070a7d1 --- /dev/null +++ b/knoda/src/B074_CommentSequence.java @@ -0,0 +1,109 @@ +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 B074_CommentSequence { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final int commentNum = scan.nextInt(); + final int commentInfoNum = 3; // commentInfoNum : コメントの情報の数(ID、返信先、いいね、の3つ) + + final List> commentList = new ArrayList>(); + // コメントの情報(ID、返信先、いいね)を入力する + for (int i = 0; i < commentNum; i++) { + final List comment = new ArrayList(); + for (int j = 0; j < commentInfoNum; j++) { + comment.add(scan.next()); + } + commentList.add(comment); + } + CommentSequence commentSequence = new CommentSequence(); + System.out.println(commentSequence.getPopularCommentID(commentList)); + scan.close(); + } + +} + +class CommentSequence { + private final int COMMENT_ID_INDEX = 0; // IDの要素番号 + private final int REPLY_COMMENT_ID_INDEX = 1; // 返信先IDの要素番号 + private final int GOOD_INDEX = 2; // いいねの要素番号 + private final int MAX_COMMENT_ID = 100; // コメントの最大ID + + // 注目度が最大のコメントIDを取得する + public int getPopularCommentID(final List> commentList) { + // visibilityMap : それぞれのコメントのIDと注目度を格納するマップ + final Map visibilityMap = new LinkedHashMap(); + + // コメントの注目度を算出する + for (final List comment : commentList) { + int visibility = getVisibility(comment, commentList); + visibilityMap.put(Integer.parseInt(comment.get(COMMENT_ID_INDEX)), visibility); + } + + final Set commentIDSet = visibilityMap.keySet(); + int popularCommentID = MAX_COMMENT_ID; + int popularVisibility = 0; + // 注目度が最大のコメントIDを算出する + for (final Integer commentID : commentIDSet) { + if (popularVisibility < visibilityMap.get(commentID)) { + popularVisibility = visibilityMap.get(commentID); + popularCommentID = commentID; + } else if (popularVisibility == visibilityMap.get(commentID)) { + // 注目度が最大のコメントが複数存在するとき、それらの中からコメントIDが最も小さいものを取得する + if (commentID < popularCommentID) { + popularCommentID = commentID; + } + } + } + return popularCommentID; + } + + // コメントの注目度を取得するメソッド + private int getVisibility(final List comment, final List> commentList) { + final String commentID = comment.get(COMMENT_ID_INDEX); + int visibility = Integer.parseInt(comment.get(GOOD_INDEX)); + + // コメントの注目度を算出する + // replyComment : 返信元のコメント + for (final List replyComment : commentList) { + if (commentID.equals(replyComment.get(REPLY_COMMENT_ID_INDEX))) { + visibility += getVisibilityLinkedReplyComment(replyComment, commentList); + } + } + return visibility; + } + + // 3つ以上連結しているコメントの注目度を算出する + private int getVisibilityLinkedReplyComment(final List replyComment, final List> commentList) { + int visibility = Integer.parseInt(replyComment.get(GOOD_INDEX)); + String commentID = replyComment.get(COMMENT_ID_INDEX); + + // 返信元のコメントが存在しなくなるまで繰り返す + while (true) { + boolean isLinkedReplyComment = false; // isLinkedReplyComment : 返信元のコメントが存在するかの判定 + + // コメントの注目度を算出する + for (final List linkedReplyComment : commentList) { + if (commentID.equals(linkedReplyComment.get(REPLY_COMMENT_ID_INDEX))) { + visibility += Integer.parseInt(linkedReplyComment.get(GOOD_INDEX)); + isLinkedReplyComment = true; + commentID = linkedReplyComment.get(COMMENT_ID_INDEX); + break; + } + } + + // 返信元のコメントが存在しないとき + if (!isLinkedReplyComment) { + break; + } + } + return visibility; + } +} diff --git a/knoda/test/B074_CommentSequenceTest.java b/knoda/test/B074_CommentSequenceTest.java new file mode 100644 index 0000000..ed4f7f4 --- /dev/null +++ b/knoda/test/B074_CommentSequenceTest.java @@ -0,0 +1,65 @@ +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 B074_CommentSequenceTest { + + @Test + public void コメントが3つ以上連結しているとき() { + final List> commentList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList("3", "None", "5")), + new ArrayList(Arrays.asList("7", "3", "3")), + new ArrayList(Arrays.asList("8", "7", "4")), + new ArrayList(Arrays.asList("10", "8", "2")), + new ArrayList(Arrays.asList("5", "10", "6")) + )); + CommentSequence commentSequence = new CommentSequence(); + int expected = 3; + int actual = commentSequence.getPopularCommentID(commentList); + assertThat(actual, is(expected)); + } + + @Test + public void 注目度の高いコメントが複数存在するとき() { + final List> commentList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList("10", "None", "10")), + new ArrayList(Arrays.asList("5", "None", "5")), + new ArrayList(Arrays.asList("8", "5", "5")), + new ArrayList(Arrays.asList("4", "2", "6")), + new ArrayList(Arrays.asList("7", "4", "4")) + )); + CommentSequence commentSequence = new CommentSequence(); + int expected = 4; + int actual = commentSequence.getPopularCommentID(commentList); + assertThat(actual, is(expected)); + } + + @Test + public void コメントが3つ以上連結しているときとそうでないコメントが混在するとき() { + final List> commentList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList("22", "37", "77")), + new ArrayList(Arrays.asList("37", "29", "81")), + new ArrayList(Arrays.asList("11", "None", "32")), + new ArrayList(Arrays.asList("64", "93", "18")), + new ArrayList(Arrays.asList("46", "37", "12")), + new ArrayList(Arrays.asList("51", "None", "9")), + new ArrayList(Arrays.asList("84", "37", "15")), + new ArrayList(Arrays.asList("29", "11", "64")), + new ArrayList(Arrays.asList("73", "64", "71")), + new ArrayList(Arrays.asList("93", "51", "50")) + )); + CommentSequence commentSequence = new CommentSequence(); + int expected = 11; + int actual = commentSequence.getPopularCommentID(commentList); + assertThat(actual, is(expected)); + } + + +} -- GitLab From 6798dbe4ca4e083b298690c2f149c45c1fbe81a7 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, 1 Aug 2022 17:10:42 +0900 Subject: [PATCH 2/4] =?UTF-8?q?B074=20=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E9=A0=86=E5=BA=8F=20ver1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/test/B074_CommentSequenceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knoda/test/B074_CommentSequenceTest.java b/knoda/test/B074_CommentSequenceTest.java index ed4f7f4..204ae6c 100644 --- a/knoda/test/B074_CommentSequenceTest.java +++ b/knoda/test/B074_CommentSequenceTest.java @@ -32,7 +32,7 @@ public class B074_CommentSequenceTest { new ArrayList(Arrays.asList("10", "None", "10")), new ArrayList(Arrays.asList("5", "None", "5")), new ArrayList(Arrays.asList("8", "5", "5")), - new ArrayList(Arrays.asList("4", "2", "6")), + new ArrayList(Arrays.asList("4", "None", "6")), new ArrayList(Arrays.asList("7", "4", "4")) )); CommentSequence commentSequence = new CommentSequence(); -- GitLab From d1a4a44cee46d1ea3832aa76b6ca46fd32e73087 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: Tue, 2 Aug 2022 13:37:29 +0900 Subject: [PATCH 3/4] =?UTF-8?q?B074=20=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E9=A0=86=E5=BA=8Fver1.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/B074_CommentSequence.java | 86 +++++++++++------------------ 1 file changed, 33 insertions(+), 53 deletions(-) diff --git a/knoda/src/B074_CommentSequence.java b/knoda/src/B074_CommentSequence.java index 070a7d1..c519d77 100644 --- a/knoda/src/B074_CommentSequence.java +++ b/knoda/src/B074_CommentSequence.java @@ -12,10 +12,10 @@ public class B074_CommentSequence { public static void main(String[] args) { final Scanner scan = new Scanner(System.in); final int commentNum = scan.nextInt(); - final int commentInfoNum = 3; // commentInfoNum : コメントの情報の数(ID、返信先、いいね、の3つ) - final List> commentList = new ArrayList>(); - // コメントの情報(ID、返信先、いいね)を入力する + final int commentInfoNum = 3; // コメントの情報数(コメントID、返信先ID、いいねの数、の3つ) + + // コメント(コメントID、返信先ID、いいねの数)の情報を入力する for (int i = 0; i < commentNum; i++) { final List comment = new ArrayList(); for (int j = 0; j < commentInfoNum; j++) { @@ -24,40 +24,41 @@ public class B074_CommentSequence { commentList.add(comment); } CommentSequence commentSequence = new CommentSequence(); + // 最も注目度の高いコメントIDを取得する System.out.println(commentSequence.getPopularCommentID(commentList)); scan.close(); } } +//最も注目度の高いコメントIDを取得するクラス class CommentSequence { - private final int COMMENT_ID_INDEX = 0; // IDの要素番号 + private final int COMMENT_ID_INDEX = 0; // コメントIDの要素番号 private final int REPLY_COMMENT_ID_INDEX = 1; // 返信先IDの要素番号 - private final int GOOD_INDEX = 2; // いいねの要素番号 - private final int MAX_COMMENT_ID = 100; // コメントの最大ID + private final int GOOD_INDEX = 2; // いいねの数の要素番号 + private final int MAX_COMMENT_ID = 100; // コメントIDの最大値 - // 注目度が最大のコメントIDを取得する + // 最も注目の高いコメントIDを取得するメソッド public int getPopularCommentID(final List> commentList) { - // visibilityMap : それぞれのコメントのIDと注目度を格納するマップ - final Map visibilityMap = new LinkedHashMap(); + // commentGoodMap : それぞれのコメントのIDといいねの数を格納したマップ + Map commentGoodMap = new LinkedHashMap(); - // コメントの注目度を算出する for (final List comment : commentList) { - int visibility = getVisibility(comment, commentList); - visibilityMap.put(Integer.parseInt(comment.get(COMMENT_ID_INDEX)), visibility); + final int visibility = getVisibility(comment, commentList); + commentGoodMap.put(Integer.parseInt(comment.get(COMMENT_ID_INDEX)), visibility); } - final Set commentIDSet = visibilityMap.keySet(); - int popularCommentID = MAX_COMMENT_ID; - int popularVisibility = 0; - // 注目度が最大のコメントIDを算出する - for (final Integer commentID : commentIDSet) { - if (popularVisibility < visibilityMap.get(commentID)) { - popularVisibility = visibilityMap.get(commentID); + Set commentIDSet = commentGoodMap.keySet(); + int popularVisibility = 0; // 最も高いコメントの注目度 + int popularCommentID = MAX_COMMENT_ID; // 最も注目度の高いコメントID + // 最も注目度の高いコメントIDを取得する + for (Integer commentID : commentIDSet) { + if (popularVisibility < commentGoodMap.get(commentID)) { + popularVisibility = commentGoodMap.get(commentID); popularCommentID = commentID; - } else if (popularVisibility == visibilityMap.get(commentID)) { - // 注目度が最大のコメントが複数存在するとき、それらの中からコメントIDが最も小さいものを取得する - if (commentID < popularCommentID) { + } else if (popularVisibility == commentGoodMap.get(commentID)) { + // 最も注目度の高いコメントが複数存在するとき、それらの中で最も小さいコメントIDを取得する + if (popularCommentID > commentID) { popularCommentID = commentID; } } @@ -65,44 +66,23 @@ class CommentSequence { return popularCommentID; } - // コメントの注目度を取得するメソッド + // コメントのいいねの数を取得するメソッド private int getVisibility(final List comment, final List> commentList) { - final String commentID = comment.get(COMMENT_ID_INDEX); int visibility = Integer.parseInt(comment.get(GOOD_INDEX)); + // System.out.println(visibility); + // replyCommentList : リプライコメントを格納したリスト + final List> replyCommentList = new ArrayList>(); - // コメントの注目度を算出する - // replyComment : 返信元のコメント + // リプライコメントを取得する for (final List replyComment : commentList) { - if (commentID.equals(replyComment.get(REPLY_COMMENT_ID_INDEX))) { - visibility += getVisibilityLinkedReplyComment(replyComment, commentList); + if (comment.get(COMMENT_ID_INDEX).equals(replyComment.get(REPLY_COMMENT_ID_INDEX))) { + replyCommentList.add(replyComment); } } - return visibility; - } - - // 3つ以上連結しているコメントの注目度を算出する - private int getVisibilityLinkedReplyComment(final List replyComment, final List> commentList) { - int visibility = Integer.parseInt(replyComment.get(GOOD_INDEX)); - String commentID = replyComment.get(COMMENT_ID_INDEX); - // 返信元のコメントが存在しなくなるまで繰り返す - while (true) { - boolean isLinkedReplyComment = false; // isLinkedReplyComment : 返信元のコメントが存在するかの判定 - - // コメントの注目度を算出する - for (final List linkedReplyComment : commentList) { - if (commentID.equals(linkedReplyComment.get(REPLY_COMMENT_ID_INDEX))) { - visibility += Integer.parseInt(linkedReplyComment.get(GOOD_INDEX)); - isLinkedReplyComment = true; - commentID = linkedReplyComment.get(COMMENT_ID_INDEX); - break; - } - } - - // 返信元のコメントが存在しないとき - if (!isLinkedReplyComment) { - break; - } + // リプライコメントのリプライコメントを取得し、注目度を算出する(再帰呼び出し) + for (final List replyComment : replyCommentList) { + visibility += getVisibility(replyComment, commentList); } return visibility; } -- GitLab From f9f036a5bc7d3c4df174e89cc814b7793763d418 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: Tue, 2 Aug 2022 13:51:15 +0900 Subject: [PATCH 4/4] =?UTF-8?q?B074=20=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E9=A0=86=E5=BA=8Fver1.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/B074_CommentSequence.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/knoda/src/B074_CommentSequence.java b/knoda/src/B074_CommentSequence.java index c519d77..aaa6f8b 100644 --- a/knoda/src/B074_CommentSequence.java +++ b/knoda/src/B074_CommentSequence.java @@ -40,23 +40,26 @@ class CommentSequence { // 最も注目の高いコメントIDを取得するメソッド public int getPopularCommentID(final List> commentList) { - // commentGoodMap : それぞれのコメントのIDといいねの数を格納したマップ - Map commentGoodMap = new LinkedHashMap(); + // notExistCommentGoodMap : 返信先が存在しないコメントのIDといいねの数を格納したマップ + Map notExistCommentGoodMap = new LinkedHashMap(); for (final List comment : commentList) { final int visibility = getVisibility(comment, commentList); - commentGoodMap.put(Integer.parseInt(comment.get(COMMENT_ID_INDEX)), visibility); + if ("None".equals(comment.get(REPLY_COMMENT_ID_INDEX))) { + // 返信先IDが存在しないコメントを格納する + notExistCommentGoodMap.put(Integer.parseInt(comment.get(COMMENT_ID_INDEX)), visibility); + } } - Set commentIDSet = commentGoodMap.keySet(); + Set notExistCommentIDSet = notExistCommentGoodMap.keySet(); int popularVisibility = 0; // 最も高いコメントの注目度 int popularCommentID = MAX_COMMENT_ID; // 最も注目度の高いコメントID // 最も注目度の高いコメントIDを取得する - for (Integer commentID : commentIDSet) { - if (popularVisibility < commentGoodMap.get(commentID)) { - popularVisibility = commentGoodMap.get(commentID); + for (final Integer commentID : notExistCommentIDSet) { + if (popularVisibility < notExistCommentGoodMap.get(commentID)) { + popularVisibility = notExistCommentGoodMap.get(commentID); popularCommentID = commentID; - } else if (popularVisibility == commentGoodMap.get(commentID)) { + } else if (popularVisibility == notExistCommentGoodMap.get(commentID)) { // 最も注目度の高いコメントが複数存在するとき、それらの中で最も小さいコメントIDを取得する if (popularCommentID > commentID) { popularCommentID = commentID; -- GitLab