From 6aa8ded9bd015c81733dd36d036738312623f71d Mon Sep 17 00:00:00 2001 From: Arachne Date: Sun, 11 Jun 2023 20:55:29 +0900 Subject: [PATCH 1/3] course input --- src/main/java/pairmatching/Application.java | 3 + src/main/java/pairmatching/Course.java | 25 ++++ .../java/pairmatching/CourseLevelMission.java | 17 +++ src/main/java/pairmatching/Crew.java | 6 + src/main/java/pairmatching/Level.java | 27 ++++ src/main/java/pairmatching/Match.java | 115 ++++++++++++++++++ 6 files changed, 193 insertions(+) create mode 100644 src/main/java/pairmatching/Course.java create mode 100644 src/main/java/pairmatching/CourseLevelMission.java create mode 100644 src/main/java/pairmatching/Crew.java create mode 100644 src/main/java/pairmatching/Level.java create mode 100644 src/main/java/pairmatching/Match.java diff --git a/src/main/java/pairmatching/Application.java b/src/main/java/pairmatching/Application.java index 6f56e741c..cff781ae1 100644 --- a/src/main/java/pairmatching/Application.java +++ b/src/main/java/pairmatching/Application.java @@ -2,6 +2,9 @@ public class Application { public static void main(String[] args) { + Match match = new Match(); + Match.run(); + // TODO 구현 진행 } } diff --git a/src/main/java/pairmatching/Course.java b/src/main/java/pairmatching/Course.java new file mode 100644 index 000000000..b1fc42685 --- /dev/null +++ b/src/main/java/pairmatching/Course.java @@ -0,0 +1,25 @@ +package pairmatching; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public enum Course { + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + private String name; + Course(String name) { + this.name = name; + } + public String label() { + return name; + } + public static List toArrayname() { + List result = Arrays.asList(new String[Course.values().length]); + + for (Course course: Course.values()) { + result.add(course.label()); + } + return result; + } +} diff --git a/src/main/java/pairmatching/CourseLevelMission.java b/src/main/java/pairmatching/CourseLevelMission.java new file mode 100644 index 000000000..c86221f47 --- /dev/null +++ b/src/main/java/pairmatching/CourseLevelMission.java @@ -0,0 +1,17 @@ +package pairmatching; + +public class CourseLevelMission { + Course course; + Level level; + String mission; + + public CourseLevelMission (Course course, Level level, String mission) { + this.course = course; + this.level = level; + this.mission = mission; + } + + public boolean isEquals(CourseLevelMission courseLevelMission) { + return course.equals(courseLevelMission.course) && level.equals(courseLevelMission.level) && mission.equals(courseLevelMission.mission); + } +} diff --git a/src/main/java/pairmatching/Crew.java b/src/main/java/pairmatching/Crew.java new file mode 100644 index 000000000..52c2a9e70 --- /dev/null +++ b/src/main/java/pairmatching/Crew.java @@ -0,0 +1,6 @@ +package pairmatching; + +public class Crew { + private Course course; + private String name; +} diff --git a/src/main/java/pairmatching/Level.java b/src/main/java/pairmatching/Level.java new file mode 100644 index 000000000..ad5a07ca8 --- /dev/null +++ b/src/main/java/pairmatching/Level.java @@ -0,0 +1,27 @@ +package pairmatching; + +import java.util.Arrays; +import java.util.List; + +public enum Level { + LEVEL1("레벨1"), + LEVEL2("레벨2"), + LEVEL3("레벨3"), + LEVEL4("레벨4"), + LEVEL5("레벨5"); + private String name; + Level(String name) { + this.name = name; + } + public String label() { + return name; + } + public static List toArrayname() { + List result = Arrays.asList(new String[Level.values().length]); + + for (Level level: Level.values()) { + result.add(level.label()); + } + return result; + } +} diff --git a/src/main/java/pairmatching/Match.java b/src/main/java/pairmatching/Match.java new file mode 100644 index 000000000..a61536678 --- /dev/null +++ b/src/main/java/pairmatching/Match.java @@ -0,0 +1,115 @@ +package pairmatching; + +import static camp.nextstep.edu.missionutils.Console.*; + +import java.util.StringTokenizer; + +public class Match { + private static final String MENU = "기능을 선택하세요.\n1. 페어 매칭\n2. 페어 조회\n3. 페어 초기화\nQ. 종료"; + private static final String ERRMESSAGE= "[ERROR] 잘못 입력하셨습니다."; + private static final String MATCHPAIRHEAD = "#############################################\n" + + "과정: 백엔드 | 프론트엔드\n" + + "미션:\n" + + " - 레벨1: 자동차경주 | 로또 | 숫자야구게임\n" + + " - 레벨2: 장바구니 | 결제 | 지하철노선도\n" + + " - 레벨3: \n" + + " - 레벨4: 성능개선 | 배포\n" + + " - 레벨5: \n" + + "############################################\n"; + private static final String CLECTMATCHPAIR = "과정, 레벨, 미션을 선택하세요.\n" + + "ex) 백엔드, 레벨1, 자동차경주"; + + public static void run() { + String menu; + + while(true) { + boolean exit; + printMenu(); + try { + menu = getMenuInput(); + exit = runMenu(menu); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; + } + if (exit) { + break; + } + } + } + + private static void printMenu() { + System.out.println(MENU); + } + + private static String getMenuInput() { + return readLine(); + } + + private static boolean runMenu(String menu) { + if (menu.equals("1")) { + matchPair(); + return true; + } + if (menu.equals("2")) { + inqueryPair(); + return true; + } + if (menu.equals("3")) { + resetPair(); + return true; + } + if (menu.equals("Q")) { + return false; + } + throw new IllegalArgumentException(ERRMESSAGE); + } + private static void matchPair() { + printMatchPairHead(); + while(true) { + try { + printSelectMatchPair(); + CourseLevelMission courseLevelMission = getCourseLevelMission(); + break; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + private static void printMatchPairHead() { + System.out.println(MATCHPAIRHEAD); + } + private static void printSelectMatchPair() { + System.out.println(CLECTMATCHPAIR); + } + private static CourseLevelMission getCourseLevelMission() { + String input = readLine(); + + validateCourseLevelMission(input); + + StringTokenizer st = new StringTokenizer(input); + Course course = Course.valueOf(st.nextToken()); + Level level = Level.valueOf(st.nextToken()); + String mission = st.nextToken(); + + return new CourseLevelMission(course, level, mission); + } + private static void validateCourseLevelMission(String input) { + String[] inputArray = input.split(", "); + if (inputArray.length != 3) { + throw new IllegalArgumentException(ERRMESSAGE); + } + if (!Course.toArrayname().contains(inputArray[0])) { + throw new IllegalArgumentException(ERRMESSAGE); + } + if (!Level.toArrayname().contains(inputArray[1])) { + throw new IllegalArgumentException(ERRMESSAGE); + } + } + private static void inqueryPair() { + + } + private static void resetPair() { + + } +} From b332990044e351111f42152b1ed04336db0aba61 Mon Sep 17 00:00:00 2001 From: Arachne Date: Mon, 12 Jun 2023 00:21:32 +0900 Subject: [PATCH 2/3] printresult --- .../java/pairmatching/CourseLevelMission.java | 18 +- src/main/java/pairmatching/Match.java | 198 +++++++++++++++++- src/main/java/pairmatching/Pairs.java | 37 ++++ 3 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 src/main/java/pairmatching/Pairs.java diff --git a/src/main/java/pairmatching/CourseLevelMission.java b/src/main/java/pairmatching/CourseLevelMission.java index c86221f47..498098061 100644 --- a/src/main/java/pairmatching/CourseLevelMission.java +++ b/src/main/java/pairmatching/CourseLevelMission.java @@ -1,5 +1,8 @@ package pairmatching; +import java.util.List; +import java.util.Objects; + public class CourseLevelMission { Course course; Level level; @@ -11,7 +14,20 @@ public CourseLevelMission (Course course, Level level, String mission) { this.mission = mission; } - public boolean isEquals(CourseLevelMission courseLevelMission) { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CourseLevelMission)) { + return false; + } + CourseLevelMission courseLevelMission = (CourseLevelMission) o; return course.equals(courseLevelMission.course) && level.equals(courseLevelMission.level) && mission.equals(courseLevelMission.mission); } + + @Override + public int hashCode() { + return Objects.hash(mission); + } } diff --git a/src/main/java/pairmatching/Match.java b/src/main/java/pairmatching/Match.java index a61536678..82091e30c 100644 --- a/src/main/java/pairmatching/Match.java +++ b/src/main/java/pairmatching/Match.java @@ -2,8 +2,20 @@ import static camp.nextstep.edu.missionutils.Console.*; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.StringTokenizer; +import camp.nextstep.edu.missionutils.Randoms; + public class Match { private static final String MENU = "기능을 선택하세요.\n1. 페어 매칭\n2. 페어 조회\n3. 페어 초기화\nQ. 종료"; private static final String ERRMESSAGE= "[ERROR] 잘못 입력하셨습니다."; @@ -18,10 +30,25 @@ public class Match { + "############################################\n"; private static final String CLECTMATCHPAIR = "과정, 레벨, 미션을 선택하세요.\n" + "ex) 백엔드, 레벨1, 자동차경주"; + private static final String BACKENDPATH = "./src/main/resources/backend-crew.md"; + private static final String FRONTENDPATH = "./src/main/resources/frontend-crew.md"; + private static List backendCrewNames = null; + private static List frontCrewNames = null; + private static Map courseLevelMissionMap; + private static final String[] LEVEL1MISSIONS = {"자동차경주", "로또", "숫자야구게임"}; + private static final String[] LEVEL2MISSIONS = {"장바구니", "결제", "지하철노선도"}; + private static final String[] LEVEL4MISSIONS = {"성능개선", "배포"}; + private static final String REMATCH = "매칭 정보가 있습니다. 다시 매칭하시겠습니까?\n네 | 아니오"; + private static final String RESULTMATCH = "페어 매칭 결과입니다."; public static void run() { String menu; + backendCrewNames = getCrews(BACKENDPATH); + frontCrewNames = getCrews(FRONTENDPATH); + + initailizeCourse(); + while(true) { boolean exit; printMenu(); @@ -37,6 +64,44 @@ public static void run() { } } } + private static void initailizeCourse() { + for (Course course: Course.values()) { + initailizeLevel(course); + } + } + private static void initailizeLevel(Course course) { + for (Level level: Level.values()) { + initailizeMission(course, level); + } + } + private static void initailizeMission(Course course, Level level) { + if (level == Level.LEVEL1) { + for (String mission : LEVEL1MISSIONS) { + courseLevelMissionMap.put(new CourseLevelMission(course, level, mission),new Pairs()); + } + return; + } + if (level == Level.LEVEL2) { + for (String mission : LEVEL2MISSIONS) { + courseLevelMissionMap.put(new CourseLevelMission(course, level, mission),new Pairs()); + } + return; + } + if (level == Level.LEVEL4) { + for (String mission : LEVEL4MISSIONS) { + courseLevelMissionMap.put(new CourseLevelMission(course, level, mission),new Pairs()); + } + } + } + private static List getCrews(String path) { + List lines = null; + try { + lines = Files.readAllLines(Paths.get(path)); + } catch (IOException i) { + System.out.println(i.getMessage()); + } + return lines; + } private static void printMenu() { System.out.println(MENU); @@ -52,11 +117,11 @@ private static boolean runMenu(String menu) { return true; } if (menu.equals("2")) { - inqueryPair(); + //inqueryPair(); return true; } if (menu.equals("3")) { - resetPair(); + //resetPair(); return true; } if (menu.equals("Q")) { @@ -70,12 +135,107 @@ private static void matchPair() { try { printSelectMatchPair(); CourseLevelMission courseLevelMission = getCourseLevelMission(); + if (checkCourseLevelMission(courseLevelMission)) { + continue; + } + makePair(courseLevelMission); + printResult(courseLevelMission); break; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } + private static void printResult(CourseLevelMission courseLevelMission) { + Pairs pairs = courseLevelMissionMap.get(courseLevelMission); + + System.out.println(pairs.toString()); + + } + private static boolean checkCourseLevelMission(CourseLevelMission courseLevelMission) { + Pairs pairs = courseLevelMissionMap.get(courseLevelMission); + if (!pairs.isnull) { + while (true) { + try { + printRematch(); + if (!getRematch()) { + return false; + } + return true; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + return false; + } + private static void makePair(CourseLevelMission courseLevelMission) { + List shuffledCrew; + List pairs; + if (courseLevelMission.course == Course.BACKEND) { + int count = 0; + while (count<3) { + shuffledCrew = Randoms.shuffle(backendCrewNames); + pairs = new ArrayList<>(); + if (shuffledCrew.size()%2==0) { + for (int i = 0; i < shuffledCrew.size(); i += 2) { + String[] pair = new String[2]; + pair[0] = shuffledCrew.get(i); + pair[1] = shuffledCrew.get(i+1); + pairs.add(pair); + } + } else { + for (int i = 0; i < shuffledCrew.size()-3; i += 2) { + String[] pair = new String[2]; + pair[0] = shuffledCrew.get(i); + pair[1] = shuffledCrew.get(i+1); + pairs.add(pair); + } + String[] pair = new String[3]; + pair[0] = shuffledCrew.get(shuffledCrew.size()-3); + pair[1] = shuffledCrew.get(shuffledCrew.size()-2); + pair[2] = shuffledCrew.get(shuffledCrew.size()-1); + pairs.add(pair); + } + + if (checkLevelPair(courseLevelMission.course, courseLevelMission.level, pairs)) { + count += 1; + continue; + } + courseLevelMissionMap.put(courseLevelMission,new Pairs(pairs)); + break; + } + if (count == 3) { + throw new IllegalArgumentException(ERRMESSAGE); + } + } + } + + private static boolean checkLevelPair(Course course, Level level, List pairs) { + for (Map.Entry entry: courseLevelMissionMap.entrySet()) { + CourseLevelMission courseLevelMission = (CourseLevelMission)entry.getKey(); + if (courseLevelMission.course == course && courseLevelMission.level == level) { + if (((Pairs)entry.getValue()).checkPair(pairs)) { + return false; + } + } + } + return true; + } + + private static boolean getRematch() { + String rematch = readLine(); + if (rematch.equals("네")) { + return true; + } + if (rematch.equals("아니요")) { + return false; + } + throw new IllegalArgumentException(ERRMESSAGE); + } + private static void printRematch() { + System.out.println(REMATCH); + } private static void printMatchPairHead() { System.out.println(MATCHPAIRHEAD); } @@ -96,20 +256,40 @@ private static CourseLevelMission getCourseLevelMission() { } private static void validateCourseLevelMission(String input) { String[] inputArray = input.split(", "); + String course = inputArray[0]; + String level = inputArray[0]; + String mission = inputArray[0]; + + if (inputArray.length != 3) { throw new IllegalArgumentException(ERRMESSAGE); } - if (!Course.toArrayname().contains(inputArray[0])) { + if (!Course.toArrayname().contains(course)) { throw new IllegalArgumentException(ERRMESSAGE); } - if (!Level.toArrayname().contains(inputArray[1])) { + if (!Level.toArrayname().contains(level)) { + throw new IllegalArgumentException(ERRMESSAGE); + } + if (!isMissionInCourseLevel(course, level, mission)) { throw new IllegalArgumentException(ERRMESSAGE); } } - private static void inqueryPair() { - - } - private static void resetPair() { - + private static boolean isMissionInCourseLevel(String course, String level, String mission) { + if (level.equals("레벨1") && Arrays.asList(LEVEL1MISSIONS).contains(mission)) { + return true; + } + if (level.equals("레벨2") && Arrays.asList(LEVEL2MISSIONS).contains(mission)) { + return true; + } + if (level.equals("레벨4") && Arrays.asList(LEVEL4MISSIONS).contains(mission)) { + return true; + } + return false; } + // private static void inqueryPair() { + // + // } + // private static void resetPair() { + // + // } } diff --git a/src/main/java/pairmatching/Pairs.java b/src/main/java/pairmatching/Pairs.java new file mode 100644 index 000000000..270383d79 --- /dev/null +++ b/src/main/java/pairmatching/Pairs.java @@ -0,0 +1,37 @@ +package pairmatching; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Pairs { + List pairs; + public boolean isnull; + public Pairs(List pairs) { + this.pairs = pairs; + isnull = false; + } + public Pairs() { + isnull = true; + } + public boolean checkPair(List pairs) { + for (String[] pairA : this.pairs) { + for (String[] pairB : pairs) { + List result = new ArrayList<>(3); + result.addAll(Arrays.asList(pairA)); + result.retainAll(Arrays.asList(pairB)); + if (result.size() >= 2) { + return false; + } + } + } + return true; + } + public String toString() { + StringBuilder sb = new StringBuilder(); + for(String[] pair: pairs) { + sb.append(String.join(" : ", pair)).append("\n"); + } + return sb.toString(); + } +} From 4addd250ce96726e6348e22b8687377bc1315196 Mon Sep 17 00:00:00 2001 From: Arachne Date: Mon, 12 Jun 2023 01:23:48 +0900 Subject: [PATCH 3/3] printresult --- src/main/java/pairmatching/Course.java | 10 ++- .../java/pairmatching/CourseLevelMission.java | 4 ++ src/main/java/pairmatching/Level.java | 11 ++- src/main/java/pairmatching/Match.java | 68 ++++++++++++------- src/main/java/pairmatching/Pairs.java | 8 ++- 5 files changed, 73 insertions(+), 28 deletions(-) diff --git a/src/main/java/pairmatching/Course.java b/src/main/java/pairmatching/Course.java index b1fc42685..2ee0d6940 100644 --- a/src/main/java/pairmatching/Course.java +++ b/src/main/java/pairmatching/Course.java @@ -15,11 +15,19 @@ public String label() { return name; } public static List toArrayname() { - List result = Arrays.asList(new String[Course.values().length]); + List result = new ArrayList<>(); for (Course course: Course.values()) { result.add(course.label()); } return result; } + public static Course toEnum(String name) { + for (Course course: Course.values()) { + if (course.name.equals(name)) { + return course; + } + } + return null; + } } diff --git a/src/main/java/pairmatching/CourseLevelMission.java b/src/main/java/pairmatching/CourseLevelMission.java index 498098061..df8328f3d 100644 --- a/src/main/java/pairmatching/CourseLevelMission.java +++ b/src/main/java/pairmatching/CourseLevelMission.java @@ -13,6 +13,9 @@ public CourseLevelMission (Course course, Level level, String mission) { this.level = level; this.mission = mission; } + public String toString() { + return course.label() + ":" +level.label() + ":" + mission; + } @Override public boolean equals(Object o) { @@ -30,4 +33,5 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(mission); } + } diff --git a/src/main/java/pairmatching/Level.java b/src/main/java/pairmatching/Level.java index ad5a07ca8..845b3fc0d 100644 --- a/src/main/java/pairmatching/Level.java +++ b/src/main/java/pairmatching/Level.java @@ -1,5 +1,6 @@ package pairmatching; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -17,11 +18,19 @@ public String label() { return name; } public static List toArrayname() { - List result = Arrays.asList(new String[Level.values().length]); + List result = new ArrayList<>(); for (Level level: Level.values()) { result.add(level.label()); } return result; } + public static Level toEnum(String name) { + for (Level level: Level.values()) { + if (level.name.equals(name)) { + return level; + } + } + return null; + } } diff --git a/src/main/java/pairmatching/Match.java b/src/main/java/pairmatching/Match.java index 82091e30c..bf955cb24 100644 --- a/src/main/java/pairmatching/Match.java +++ b/src/main/java/pairmatching/Match.java @@ -47,6 +47,8 @@ public static void run() { backendCrewNames = getCrews(BACKENDPATH); frontCrewNames = getCrews(FRONTENDPATH); + courseLevelMissionMap = new HashMap<>(); + initailizeCourse(); while(true) { @@ -114,18 +116,18 @@ private static String getMenuInput() { private static boolean runMenu(String menu) { if (menu.equals("1")) { matchPair(); - return true; + return false; } if (menu.equals("2")) { - //inqueryPair(); - return true; + inqueryPair(); + return false; } if (menu.equals("3")) { - //resetPair(); - return true; + resetPair(); + return false; } if (menu.equals("Q")) { - return false; + return true; } throw new IllegalArgumentException(ERRMESSAGE); } @@ -150,11 +152,11 @@ private static void printResult(CourseLevelMission courseLevelMission) { Pairs pairs = courseLevelMissionMap.get(courseLevelMission); System.out.println(pairs.toString()); - } private static boolean checkCourseLevelMission(CourseLevelMission courseLevelMission) { + //System.out.println("now :" + courseLevelMission.toString()); Pairs pairs = courseLevelMissionMap.get(courseLevelMission); - if (!pairs.isnull) { + if (!pairs.isn) { while (true) { try { printRematch(); @@ -247,29 +249,31 @@ private static CourseLevelMission getCourseLevelMission() { validateCourseLevelMission(input); - StringTokenizer st = new StringTokenizer(input); - Course course = Course.valueOf(st.nextToken()); - Level level = Level.valueOf(st.nextToken()); - String mission = st.nextToken(); + String[] st = input.split(", "); + Course course = Course.toEnum(st[0]); + Level level = Level.toEnum(st[1]); + String mission = st[2]; + return new CourseLevelMission(course, level, mission); } private static void validateCourseLevelMission(String input) { String[] inputArray = input.split(", "); - String course = inputArray[0]; - String level = inputArray[0]; - String mission = inputArray[0]; - - if (inputArray.length != 3) { throw new IllegalArgumentException(ERRMESSAGE); } + String course = inputArray[0]; + String level = inputArray[1]; + String mission = inputArray[2]; + if (!Course.toArrayname().contains(course)) { throw new IllegalArgumentException(ERRMESSAGE); } + if (!Level.toArrayname().contains(level)) { throw new IllegalArgumentException(ERRMESSAGE); } + if (!isMissionInCourseLevel(course, level, mission)) { throw new IllegalArgumentException(ERRMESSAGE); } @@ -286,10 +290,28 @@ private static boolean isMissionInCourseLevel(String course, String level, Strin } return false; } - // private static void inqueryPair() { - // - // } - // private static void resetPair() { - // - // } + private static void inqueryPair() { + printMatchPairHead(); + while(true) { + try { + printSelectMatchPair(); + CourseLevelMission courseLevelMission = getCourseLevelMission(); + if (checkinquery(courseLevelMission)) { + printResult(courseLevelMission); + break; + } + throw new IllegalArgumentException("[ERROR]No Pairs"); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + private static boolean checkinquery(CourseLevelMission courseLevelMission) { + Pairs pairs = courseLevelMissionMap.get(courseLevelMission); + return !pairs.isn; + } + private static void resetPair() { + initailizeCourse(); + System.out.println("초기화 되었습니다."); + } } diff --git a/src/main/java/pairmatching/Pairs.java b/src/main/java/pairmatching/Pairs.java index 270383d79..e771244f0 100644 --- a/src/main/java/pairmatching/Pairs.java +++ b/src/main/java/pairmatching/Pairs.java @@ -6,13 +6,15 @@ public class Pairs { List pairs; - public boolean isnull; + public boolean isn; public Pairs(List pairs) { this.pairs = pairs; - isnull = false; + isn = false; } public Pairs() { - isnull = true; + String[] non = {""}; + pairs = Arrays.asList(non,non); + isn = true; } public boolean checkPair(List pairs) { for (String[] pairA : this.pairs) {