diff --git a/build.gradle b/build.gradle index 4fe6044..cff5020 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') + implementation("com.google.guava:guava:31.1-jre") } tasks.named('test') { diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index e48ce2b..42d9900 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -1,38 +1,153 @@ package leets.leets_mate; +import com.google.common.collect.Lists; + import java.util.*; public class LeetsMateApplication { + //반복된 입력작업을 위해 전역변수로 선언 + Scanner scan = new Scanner(System.in); + String members; + // 동작 함수입니다. public void run() { + //입력부 + System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); + System.out.println("멤버의 이름을 입력해 주세요. ',' 로 구분"); + + //영어 입력시 예외처리 + members = inputMembers(members); + + //문자열에서 List로 변환 + List memberList = parseMembers(members); + + //최대 짝 수 입력. 예외처리 + int maxGroup = checkMaxGroup(memberList); + + //버퍼 속 개행문자 소비 + scan.nextLine(); + + //초기 결과 출력 + printResult(generateRandomGroups(memberList,maxGroup)); + + //다시추첨기능, y나n을 입력하지 않으면 예외처리 + reDraw(memberList, maxGroup); + } + + //다시 추첨 기능 + private void reDraw(List memberList, int maxGroup) { + String reDrawOpinion; + while(true){ + System.out.println("다시 추첨하겠습니까?"); + reDrawOpinion = scan.nextLine(); + reDrawOpinion = getOpinion(reDrawOpinion); + if(reDrawOpinion.equals("n")){ + break; + } + printResult(generateRandomGroups(memberList, maxGroup)); + } } + //다시 추첨 입력 예외처리 + private String getOpinion(String index) { + while(true){ + try{ + checkYesOrNo(index); + break; + }catch (IllegalArgumentException e){ + System.out.println("y나 n을 입력해주세요"); + index = scan.nextLine(); + } + } + return index; + } + + //최대 짝 수 크기 예외 처리 + private int checkMaxGroup(List memberList) { + System.out.println("\n최대 짝 수를 입력해주세요"); + int maxGroup; + while (true) { + try { + maxGroup = scan.nextInt(); + checkDataValidity(memberNumber(memberList), maxGroup); + break; + } catch (InputMismatchException e) { + System.out.println("최대 짝 수를 다시 입력해주세요"); + scan.nextLine(); + } catch (IllegalArgumentException e) { + System.out.println("최대 짝 수를 다시 입력해주세요"); + scan.nextLine(); + } + } + return maxGroup; + } + + + //멤버 입력 예외처리 + private String inputMembers(String members) { + //초기 멤버 입력 + members = scan.nextLine(); + while(true) { + try { + checkHasNoEnglish(members); + break; + } catch (IllegalArgumentException e) { + System.out.println("멤버의 이름을 한글로 다시 입력해 주세요. ',' 로 구분"); + members = scan.nextLine(); + } + } + return members; + } + + // 문자열로된 멤버들을 리스트로 분리하는 함수입니다. public List parseMembers(String members) { - return new ArrayList<>(); + String[] parsedMember = members.split(","); + return Arrays.asList(parsedMember); } // 총 멤버수를 반환합니다. public int memberNumber(List members) { - return 0; + return members.size(); } // 멤버 문자열에 영어가 있는지 검사합니다. 영어가 있다면 예외 출력 public void checkHasNoEnglish(String members) { + for (Character c : members.toCharArray()) { + if(!((c >= 'ㄱ' && c <= '힣')||c==',')){ + throw new IllegalArgumentException("[ERROR] 이름은 한글로 입력해야 합니다."); + } + } } // 멤버수와 최대 짝수 데이터가 유효한지 검사하는 함수입니다. 유효하지 않다면 예외 출력 public void checkDataValidity(int memberCount, int maximumGroupSize) { + if(memberCount> generateRandomGroups(List memberList, int maximumGroupSize) { - return new ArrayList<>(); + Collections.shuffle(memberList); + return Lists.partition(memberList, maximumGroupSize); } // 결과를 프린트 하는 함수입니다. public void printResult(List> result) { + System.out.println("오늘의 짝 추첨 결과"); + for (List strings : result) { + System.out.println(strings); + } + System.out.println("\n추첨을 완료하였습니다.\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..67ae0c4 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; +import java.util.InputMismatchException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -33,15 +34,25 @@ void setUp() { @Test void 멤버수와_최대_멤버수를_잘못_입력한_경우_예외를_반환한다() { - assertThrows(Exception.class, () -> { + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> { app.checkDataValidity(3, 4); }); + assertThat("[ERROR] 최대 짝 수는 이름의 갯수보다 클 수 없습니다.").isEqualTo(e.getMessage()); } @Test void 멤버_문자열에_영어를_입력한_경우_예외를_반환한다() { - assertThrows(Exception.class, () -> { + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> { app.checkHasNoEnglish("welcome,to,leets"); }); + assertThat("[ERROR] 이름은 한글로 입력해야 합니다.").isEqualTo(e.getMessage()); + } + + @Test + void 다시추첨에서_잘못_입력한_경우_예외를_반환한다(){ + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> { + app.checkYesOrNo("a"); + }); + assertThat("[ERROR] 입력에는 'y','n'만 가능합니다.").isEqualTo(e.getMessage()); } } \ No newline at end of file