diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index e48ce2b..75d378c 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -3,36 +3,160 @@ import java.util.*; public class LeetsMateApplication { + Scanner sc = new Scanner(System.in); + String newline = System.lineSeparator(); + boolean retry = true; // 동작 함수입니다. public void run() { + System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); + + List members = parseMembers(inputMembers()); + + int maximumGroupSize = inputMaximumGroupSize(memberNumber(members)); + System.out.println(); + + printResult(generateRandomGroups(members, maximumGroupSize)); + + sc.close(); + } + + // 멤버들을 문자열로 입력 받는 함수입니다. + 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(); + } + + return memberNamesInput; } // 문자열로된 멤버들을 리스트로 분리하는 함수입니다. public List parseMembers(String members) { - return new ArrayList<>(); + 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 0; + return members.size(); } - // 멤버 문자열에 영어가 있는지 검사합니다. 영어가 있다면 예외 출력 - public void checkHasNoEnglish(String members) { + // 멤버 문자열에 한글과 쉼표만 있는지 검사합니다. 이외의 문자가 있으면 예외 출 + public void checkHasOnlyKorean(String members) { + if (!members.matches("^[가-힣,]+$")) { + throw new IllegalArgumentException("[ERROR] 이름은 한글로 입력해야 합니다."); + } } // 멤버수와 최대 짝수 데이터가 유효한지 검사하는 함수입니다. 유효하지 않다면 예외 출력 public void checkDataValidity(int memberCount, int maximumGroupSize) { + if (memberCount < maximumGroupSize) { + throw new IllegalArgumentException("[ERROR] 최대 짝 수는 이름의 갯수보다 클 수 없습니다."); + } } // 랜덤 짝꿍 추첨하는 함수 입니다. public List> generateRandomGroups(List memberList, int maximumGroupSize) { - return new ArrayList<>(); + Collections.shuffle(memberList); + + List> result = new ArrayList<>(); + List currentGroup = new ArrayList<>(); + + for (String member : memberList) { + if (member.isEmpty()) { + continue; + } + + currentGroup.add(member); + + if (currentGroup.size() == maximumGroupSize) { + result.add(new ArrayList<>(currentGroup)); + currentGroup.clear(); + } + } + + if (!currentGroup.isEmpty()) { + result.add(new ArrayList<>(currentGroup)); + } + + return result; } // 결과를 프린트 하는 함수입니다. public void printResult(List> result) { + while (retry) { + System.out.println("오늘의 짝 추천 결과입니다."); + + StringBuilder sb = new StringBuilder(); + + for (List group : result) { + StringJoiner sj = new StringJoiner(" | ", "[ ", " ]"); + + for (String member : group) { + sj.add(member); + } + + sb.append(sj).append(newline); + } + + sb.append(newline).append("추천을 완료했습니다."); + System.out.println(sb); + + askRetry(); + } + + System.out.println("자리를 이동해 서로에게 인사해주세요."); + } + + // 다시 추천을 할지 물어보는 함수입니다. + 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; + } + + if (operator.equals("y")) { + System.out.println("--------------------------------"); + return true; + } + + throw new IllegalArgumentException("[ERROR] y 또는 n을 입력해주세요."); } public static void main(String[] args) { diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 706e295..b82ad03 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("리츠에", "오신", "걸", "환영합니다"); @@ -39,9 +39,16 @@ void setUp() { } @Test - void 멤버_문자열에_영어를_입력한_경우_예외를_반환한다() { + void 멤버_문자열에_하글_이외를_입력한_경우_예외를_반환한다() { assertThrows(Exception.class, () -> { - app.checkHasNoEnglish("welcome,to,leets"); + app.checkHasOnlyKorean("welcome,to,leets"); + }); + } + + @Test + void 다시_추천_명령_에서_y나_n을_누르지_않은_경우_예외를_반환한다() { + assertThrows(Exception.class, () -> { + app.isDone("a"); }); } } \ No newline at end of file