From c0b31757629b3bbbe88347f4e40ccbed451a5de5 Mon Sep 17 00:00:00 2001 From: yechan-kim <60172300+yechan-kim@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:31:46 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=EA=B8=B0=EB=8A=A5,=20=EB=8B=A4=EC=8B=9C=20?= =?UTF-8?q?=EC=B6=94=EC=B2=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets_mate/LeetsMateApplication.java | 99 +++++++++++++++++-- 1 file changed, 90 insertions(+), 9 deletions(-) diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index e48ce2b..3f52fa8 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -3,39 +3,120 @@ import java.util.*; public class LeetsMateApplication { - // 동작 함수입니다. - public void run() { + public void run() throws Exception { + Scanner sc = new Scanner(System.in); + System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); + + System.out.println("\n참석자들의 이름을 입력해 주세요. (,로 구분)"); + String inputStr = sc.nextLine(); + List members = parseMembers(inputStr); + + + System.out.println("\n최대 짝 수를 입력해 주세요."); + int maximumGroupSize = sc.nextInt(); + sc.nextLine(); // 개행문자 제거 + checkDataValidity(memberNumber(members), maximumGroupSize); + System.out.println(); + + boolean result = true; + while (result) { + printResult(generateRandomGroups(members, maximumGroupSize)); + + System.out.print("다시 구성하시겠습니까? (y or n): "); + String operator = sc.nextLine(); + + result = ask(operator); + } + + System.out.println("자리를 이동해 서로에게 인사해주세요."); + sc.close(); } // 문자열로된 멤버들을 리스트로 분리하는 함수입니다. - public List parseMembers(String members) { - return new ArrayList<>(); + public List parseMembers(String members) throws Exception { + checkHasNoEnglish(members); + return new ArrayList<>(List.of(members.split(","))); } // 총 멤버수를 반환합니다. public int memberNumber(List members) { - return 0; + return members.size(); } // 멤버 문자열에 영어가 있는지 검사합니다. 영어가 있다면 예외 출력 - public void checkHasNoEnglish(String members) { + public void checkHasNoEnglish(String members) throws Exception { + if (members.matches(".*[a-zA-Z]+.*")) { + throw new Exception("[ERROR] 이름은 한글로 입력해야 합니다."); + } } // 멤버수와 최대 짝수 데이터가 유효한지 검사하는 함수입니다. 유효하지 않다면 예외 출력 - public void checkDataValidity(int memberCount, int maximumGroupSize) { + public void checkDataValidity(int memberCount, int maximumGroupSize) throws Exception { + if (memberCount < maximumGroupSize) { + throw new Exception("[ERROR] 최대 짝 수는 이름의 갯수보다 클 수 없습니다."); + } } // 랜덤 짝꿍 추첨하는 함수 입니다. public List> generateRandomGroups(List memberList, int maximumGroupSize) { - return new ArrayList<>(); + Collections.shuffle(memberList); + + List> result = new ArrayList<>(); + List temp = new ArrayList<>(); + int i = 0; + + for (String member : memberList) { + temp.add(member); + i++; + + if (i == maximumGroupSize) { + i = 0; + result.add(new ArrayList<>(temp)); + temp.clear(); + } + } + + if (!temp.isEmpty()) { + result.add(new ArrayList<>(temp)); + } + + return result; } // 결과를 프린트 하는 함수입니다. public void printResult(List> result) { + System.out.println("오늘의 짝 추천 결과입니다."); + + StringBuilder sb = new StringBuilder(); + + for (List group : result) { + sb.append("["); + + for (int i = 0; i < group.size() - 1; i++) { + sb.append(" ").append(group.get(i)).append(" |"); + } + + sb.append(" ").append(group.get(group.size() - 1)).append(" ]\n"); + } + + sb.append("\n추천을 완료했습니다."); + System.out.println(sb.toString()); + } + + // 다시 추천을 할지 물어보는 함수입니다. + public boolean ask(String operator) throws Exception { + if (operator.equals("n")) return false; + + else if (operator.equals("y")){ + System.out.println("--------------------------------"); + return true; + } + + else throw new Exception("[ERROR] y 또는 n을 입력해주세요."); } - public static void main(String[] args) { + public static void main(String[] args) throws Exception { LeetsMateApplication app = new LeetsMateApplication(); app.run(); } From bc31b2a3b8160d59eabfb2480c4b419ba9cc2654 Mon Sep 17 00:00:00 2001 From: yechan-kim <60172300+yechan-kim@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:38:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=EB=8B=A4=EC=8B=9C=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EA=B8=B0=EB=8A=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/LeetsMateApplicationTests.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 706e295..5e2627c 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -18,7 +18,7 @@ void setUp() { } @Test - void 입력받은_문자열을_파싱하여_리스트로_만든다() { + void 입력받은_문자열을_파싱하여_리스트로_만든다() throws Exception { String members = "리츠에,오신,걸,환영합니다"; List actual = app.parseMembers(members); assertThat(actual).containsExactly("리츠에", "오신", "걸", "환영합니다"); @@ -44,4 +44,11 @@ void setUp() { app.checkHasNoEnglish("welcome,to,leets"); }); } + + @Test + void 다시_추천_명령_에서_y나_n을_누르지_않은_경우_예외를_반환한다() { + assertThrows(Exception.class, () -> { + app.ask("a"); + }); + } } \ No newline at end of file From 17a46464e30bb479a90c949e0e17d255fe372036 Mon Sep 17 00:00:00 2001 From: yechan-kim <60172300+yechan-kim@users.noreply.github.com> Date: Thu, 11 Apr 2024 17:58:43 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets_mate/LeetsMateApplication.java | 51 ++++++++++--------- .../leets_mate/LeetsMateApplicationTests.java | 2 +- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index 3f52fa8..4d97210 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -3,17 +3,19 @@ import java.util.*; public class LeetsMateApplication { + String newline = System.lineSeparator(); + // 동작 함수입니다. public void run() throws Exception { Scanner sc = new Scanner(System.in); System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); - System.out.println("\n참석자들의 이름을 입력해 주세요. (,로 구분)"); - String inputStr = sc.nextLine(); - List members = parseMembers(inputStr); + System.out.println(newline + "참석자들의 이름을 입력해 주세요. (,로 구분)"); + String memberNamesInput = sc.nextLine(); + List members = parseMembers(memberNamesInput); - System.out.println("\n최대 짝 수를 입력해 주세요."); + System.out.println(newline + "최대 짝 수를 입력해 주세요."); int maximumGroupSize = sc.nextInt(); sc.nextLine(); // 개행문자 제거 checkDataValidity(memberNumber(members), maximumGroupSize); @@ -26,7 +28,7 @@ public void run() throws Exception { System.out.print("다시 구성하시겠습니까? (y or n): "); String operator = sc.nextLine(); - result = ask(operator); + result = isDone(operator); } System.out.println("자리를 이동해 서로에게 인사해주세요."); @@ -63,22 +65,19 @@ public List> generateRandomGroups(List memberList, int maxi Collections.shuffle(memberList); List> result = new ArrayList<>(); - List temp = new ArrayList<>(); - int i = 0; + List currentGroup = new ArrayList<>(); for (String member : memberList) { - temp.add(member); - i++; + currentGroup.add(member); - if (i == maximumGroupSize) { - i = 0; - result.add(new ArrayList<>(temp)); - temp.clear(); + if (currentGroup.size() == maximumGroupSize) { + result.add(new ArrayList<>(currentGroup)); + currentGroup.clear(); } } - if (!temp.isEmpty()) { - result.add(new ArrayList<>(temp)); + if (!currentGroup.isEmpty()) { + result.add(new ArrayList<>(currentGroup)); } return result; @@ -91,29 +90,31 @@ public void printResult(List> result) { StringBuilder sb = new StringBuilder(); for (List group : result) { - sb.append("["); + StringJoiner sj = new StringJoiner(" | ", "[ ", " ]"); - for (int i = 0; i < group.size() - 1; i++) { - sb.append(" ").append(group.get(i)).append(" |"); + for (String member : group) { + sj.add(member); } - sb.append(" ").append(group.get(group.size() - 1)).append(" ]\n"); + sb.append(sj).append(newline); } - sb.append("\n추천을 완료했습니다."); - System.out.println(sb.toString()); + sb.append(newline).append("추천을 완료했습니다."); + System.out.println(sb); } // 다시 추천을 할지 물어보는 함수입니다. - public boolean ask(String operator) throws Exception { - if (operator.equals("n")) return false; + public boolean isDone(String operator) throws Exception { + if (operator.equals("n")) { + return false; + } - else if (operator.equals("y")){ + if (operator.equals("y")) { System.out.println("--------------------------------"); return true; } - else throw new Exception("[ERROR] y 또는 n을 입력해주세요."); + throw new Exception("[ERROR] y 또는 n을 입력해주세요."); } public static void main(String[] args) throws Exception { diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 5e2627c..4137729 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -48,7 +48,7 @@ void setUp() { @Test void 다시_추천_명령_에서_y나_n을_누르지_않은_경우_예외를_반환한다() { assertThrows(Exception.class, () -> { - app.ask("a"); + app.isDone("a"); }); } } \ No newline at end of file From 0923c0c2f83e2c3d1a16ab03cc738cf2b52ae7b6 Mon Sep 17 00:00:00 2001 From: yechan-kim <60172300+yechan-kim@users.noreply.github.com> Date: Thu, 11 Apr 2024 22:55:05 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets_mate/LeetsMateApplication.java | 118 ++++++++++++------ 1 file changed, 80 insertions(+), 38 deletions(-) diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index 4d97210..75d378c 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -3,60 +3,79 @@ import java.util.*; public class LeetsMateApplication { + Scanner sc = new Scanner(System.in); String newline = System.lineSeparator(); + boolean retry = true; // 동작 함수입니다. - public void run() throws Exception { - Scanner sc = new Scanner(System.in); + public void run() { System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); - System.out.println(newline + "참석자들의 이름을 입력해 주세요. (,로 구분)"); - String memberNamesInput = sc.nextLine(); - List members = parseMembers(memberNamesInput); - + List members = parseMembers(inputMembers()); - System.out.println(newline + "최대 짝 수를 입력해 주세요."); - int maximumGroupSize = sc.nextInt(); - sc.nextLine(); // 개행문자 제거 - checkDataValidity(memberNumber(members), maximumGroupSize); + int maximumGroupSize = inputMaximumGroupSize(memberNumber(members)); System.out.println(); - boolean result = true; - while (result) { - printResult(generateRandomGroups(members, maximumGroupSize)); + printResult(generateRandomGroups(members, maximumGroupSize)); - System.out.print("다시 구성하시겠습니까? (y or n): "); - String operator = sc.nextLine(); + sc.close(); + } - result = isDone(operator); + // 멤버들을 문자열로 입력 받는 함수입니다. + public String inputMembers() { + System.out.println(); + System.out.println("참석자들의 이름을 입력해 주세요. (,로 구분)"); + + String memberNamesInput = sc.nextLine(); + + try { + checkHasOnlyKorean(memberNamesInput); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputMembers(); } - System.out.println("자리를 이동해 서로에게 인사해주세요."); - sc.close(); + return memberNamesInput; } // 문자열로된 멤버들을 리스트로 분리하는 함수입니다. - public List parseMembers(String members) throws Exception { - checkHasNoEnglish(members); + public List parseMembers(String members) { return new ArrayList<>(List.of(members.split(","))); } + // 최대 짝수를 입력받는 함수입니다. + public int inputMaximumGroupSize(int memberNumber) { + System.out.println(newline + "최대 짝 수를 입력해 주세요."); + + int maximumGroupSize = sc.nextInt(); + sc.nextLine(); // 개행문자 제거 + + try { + checkDataValidity(memberNumber, maximumGroupSize); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputMaximumGroupSize(memberNumber); + } + + return maximumGroupSize; + } + // 총 멤버수를 반환합니다. public int memberNumber(List members) { return members.size(); } - // 멤버 문자열에 영어가 있는지 검사합니다. 영어가 있다면 예외 출력 - public void checkHasNoEnglish(String members) throws Exception { - if (members.matches(".*[a-zA-Z]+.*")) { - throw new Exception("[ERROR] 이름은 한글로 입력해야 합니다."); + // 멤버 문자열에 한글과 쉼표만 있는지 검사합니다. 이외의 문자가 있으면 예외 출 + public void checkHasOnlyKorean(String members) { + if (!members.matches("^[가-힣,]+$")) { + throw new IllegalArgumentException("[ERROR] 이름은 한글로 입력해야 합니다."); } } // 멤버수와 최대 짝수 데이터가 유효한지 검사하는 함수입니다. 유효하지 않다면 예외 출력 - public void checkDataValidity(int memberCount, int maximumGroupSize) throws Exception { + public void checkDataValidity(int memberCount, int maximumGroupSize) { if (memberCount < maximumGroupSize) { - throw new Exception("[ERROR] 최대 짝 수는 이름의 갯수보다 클 수 없습니다."); + throw new IllegalArgumentException("[ERROR] 최대 짝 수는 이름의 갯수보다 클 수 없습니다."); } } @@ -68,6 +87,10 @@ public List> generateRandomGroups(List memberList, int maxi List currentGroup = new ArrayList<>(); for (String member : memberList) { + if (member.isEmpty()) { + continue; + } + currentGroup.add(member); if (currentGroup.size() == maximumGroupSize) { @@ -85,26 +108,45 @@ public List> generateRandomGroups(List memberList, int maxi // 결과를 프린트 하는 함수입니다. public void printResult(List> result) { - System.out.println("오늘의 짝 추천 결과입니다."); + while (retry) { + System.out.println("오늘의 짝 추천 결과입니다."); + + StringBuilder sb = new StringBuilder(); - StringBuilder sb = new StringBuilder(); + for (List group : result) { + StringJoiner sj = new StringJoiner(" | ", "[ ", " ]"); - for (List group : result) { - StringJoiner sj = new StringJoiner(" | ", "[ ", " ]"); + for (String member : group) { + sj.add(member); + } - for (String member : group) { - sj.add(member); + sb.append(sj).append(newline); } - sb.append(sj).append(newline); + sb.append(newline).append("추천을 완료했습니다."); + System.out.println(sb); + + askRetry(); } - sb.append(newline).append("추천을 완료했습니다."); - System.out.println(sb); + System.out.println("자리를 이동해 서로에게 인사해주세요."); } // 다시 추천을 할지 물어보는 함수입니다. - public boolean isDone(String operator) throws Exception { + public void askRetry() { + System.out.print("다시 구성하시겠습니까? (y or n): "); + String operator = sc.nextLine(); + + try { + retry = isDone(operator); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + askRetry(); + } + } + + // 다시 추천에 대한 결과를 반환하는 함수입니다. + public boolean isDone(String operator) { if (operator.equals("n")) { return false; } @@ -114,10 +156,10 @@ public boolean isDone(String operator) throws Exception { return true; } - throw new Exception("[ERROR] y 또는 n을 입력해주세요."); + throw new IllegalArgumentException("[ERROR] y 또는 n을 입력해주세요."); } - public static void main(String[] args) throws Exception { + public static void main(String[] args) { LeetsMateApplication app = new LeetsMateApplication(); app.run(); } From 7e768909234ac8d21008920d932484ef9ca156cb Mon Sep 17 00:00:00 2001 From: yechan-kim <60172300+yechan-kim@users.noreply.github.com> Date: Fri, 12 Apr 2024 13:40:24 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=EB=A6=AC=ED=8E=99=ED=84=B0?= =?UTF-8?q?=EB=A7=81=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/leets/leets_mate/LeetsMateApplicationTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 4137729..b82ad03 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -39,9 +39,9 @@ void setUp() { } @Test - void 멤버_문자열에_영어를_입력한_경우_예외를_반환한다() { + void 멤버_문자열에_하글_이외를_입력한_경우_예외를_반환한다() { assertThrows(Exception.class, () -> { - app.checkHasNoEnglish("welcome,to,leets"); + app.checkHasOnlyKorean("welcome,to,leets"); }); }