From bcea6786084d816d0191e1cb858687e72e941640 Mon Sep 17 00:00:00 2001 From: Basak Date: Wed, 7 Dec 2022 20:01:52 +0900 Subject: [PATCH] =?UTF-8?q?2=EC=B0=A8=EC=8B=9C=EA=B8=B0=20-=204=EC=8B=9C?= =?UTF-8?q?=EA=B0=8430=EB=B6=84,=20=EC=99=84=EC=84=B1=EB=AA=BB=ED=95=A8,?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=97=86?= =?UTF-8?q?=EC=9D=8C,=20=EA=B7=9C=EC=A0=95=EC=95=88=EB=A7=9E=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 97 +++++++++++++++++ src/main/java/pairmatching/Application.java | 5 +- .../controller/MatchingController.java | 102 ++++++++++++++++++ .../pairmatching/domain/MatchingSystem.java | 55 ++++++++++ .../pairmatching/domain/ReadCrewFile.java | 19 ++++ .../pairmatching/domain/type/Command.java | 28 +++++ .../java/pairmatching/domain/type/Course.java | 30 ++++++ .../domain/type/CourseLevelMission.java | 43 ++++++++ .../java/pairmatching/domain/type/Crew.java | 6 ++ .../java/pairmatching/domain/type/Level.java | 31 ++++++ .../pairmatching/domain/type/Mission.java | 32 ++++++ .../java/pairmatching/domain/type/Pair.java | 57 ++++++++++ .../pairmatching/domain/type/Rematching.java | 34 ++++++ .../repository/CrewRepository.java | 23 ++++ .../repository/PairRepository.java | 45 ++++++++ .../pairmatching/util/JavaFileReader.java | 44 ++++++++ .../java/pairmatching/view/InputView.java | 23 ++++ .../java/pairmatching/view/OutputView.java | 50 +++++++++ 18 files changed, 723 insertions(+), 1 deletion(-) create mode 100644 src/main/java/pairmatching/controller/MatchingController.java create mode 100644 src/main/java/pairmatching/domain/MatchingSystem.java create mode 100644 src/main/java/pairmatching/domain/ReadCrewFile.java create mode 100644 src/main/java/pairmatching/domain/type/Command.java create mode 100644 src/main/java/pairmatching/domain/type/Course.java create mode 100644 src/main/java/pairmatching/domain/type/CourseLevelMission.java create mode 100644 src/main/java/pairmatching/domain/type/Crew.java create mode 100644 src/main/java/pairmatching/domain/type/Level.java create mode 100644 src/main/java/pairmatching/domain/type/Mission.java create mode 100644 src/main/java/pairmatching/domain/type/Pair.java create mode 100644 src/main/java/pairmatching/domain/type/Rematching.java create mode 100644 src/main/java/pairmatching/repository/CrewRepository.java create mode 100644 src/main/java/pairmatching/repository/PairRepository.java create mode 100644 src/main/java/pairmatching/util/JavaFileReader.java create mode 100644 src/main/java/pairmatching/view/InputView.java create mode 100644 src/main/java/pairmatching/view/OutputView.java diff --git a/docs/README.md b/docs/README.md index e69de29..1f32abc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,97 @@ + +# 페어매칭 + +## 동작순서 +1. 프로그램 시작 +2. 기능 선택 + 1. 페어매칭 + 1. 대상 입력 (과정, 레벨, 미션) + 2. 이미있는지 저장소 확인 + 1. 이미있는경우 다시 시도할지 입력 + 3. 페어매칭 동작 + 4. 페어매칭 결과 저장 + 5. 페어매칭 결과 출력 + 2. 페어조회 + 1. 대상 입력 (과정, 레벨, 미션) + 2. 페어매칭 결과 출력 + 3. 페어초기화 + 1. 전체 페어매칭 내용 제거 + 4. 종료 + 1. 프로그램 종료 + +### 도메인 설명 +- 과정은 백엔드 과정과 프론트엔드 과정이 있다. +- 각 과정은 5단계로 나누어 진행이 되는데 이를 레벨이라고 한다. +- 같은 레벨 동안은 같은 페어를 만나지 않는다. +```json +## 과정 +- 백엔드 +- 프론트엔드 + +## 레벨 +- 레벨1 +- 레벨2 +- 레벨3 +- 레벨4 +- 레벨5 + +## 미션 +### 레벨1 +- 자동차경주 +- 로또 +- 숫자야구게임 + +### 레벨2 +- 장바구니 +- 결제 +- 지하철노선도 + +### 레벨3(없음) + +### 레벨4 +- 성능개선 +- 배포 + +### 레벨5 (없음) +``` + +## 기능목록 +### Controller + +### InputView +- [ ] 동작할 커맨드를 읽는 기능 +- [ ] 코스 레벨 미션 명을 읽는 기능 +- [ ] 리매칭 여부를 읽는 기능 + +### OutputView + +### Util/JavaFileReader +- 파일을 한줄씩 읽는다. + +### MatchingSystem +- 페어매칭 + - 미션을 함께 수행할 페어를 두명씩 매칭한다. + - 페어 매칭 대상이 홀수인 경우 한 페어는 3인으로 구성한다. + - 같은 레벨에서 이미 페어를 맺은 크루와는 다시 페어로 매칭될 수 없다. + - 페어매칭 동작 순서 + - 크루들의 이름 목록을 List 형태로 준비한다. + - 크루 목록의 순서를 랜덤으로 섞는다. 이 때 `camp.nextstep.edu.missionutils.Randoms`의 shuffle 메서드를 활용해야 한다. + - 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. + - 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. + - 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. + - 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. + - 페어 재매칭 시도 + - 안내 문구를 출력 후 매칭을 진행한다. + - 아니오를 선택할 경우 코스, 레벨, 미션을 다시 선택한다. +- 페어 조회 기능 + - 과정, 레벨, 미션을 선택하면 해당 미션의 페어 정보를 출력한다. + - 매칭 이력이 없으면 매칭 이력이 없다고 안내한다. +- 페어 초기화 +- 종료 + +### Repository + +### Domain +- Course +- Level +- Crew diff --git a/src/main/java/pairmatching/Application.java b/src/main/java/pairmatching/Application.java index c619a21..f036ced 100644 --- a/src/main/java/pairmatching/Application.java +++ b/src/main/java/pairmatching/Application.java @@ -1,8 +1,11 @@ package pairmatching; +import pairmatching.controller.MatchingController; + public class Application { public static void main(String[] args) { // TODO 구현 진행 - + MatchingController matchingController = new MatchingController(); + matchingController.system(); } } diff --git a/src/main/java/pairmatching/controller/MatchingController.java b/src/main/java/pairmatching/controller/MatchingController.java new file mode 100644 index 0000000..e7c2590 --- /dev/null +++ b/src/main/java/pairmatching/controller/MatchingController.java @@ -0,0 +1,102 @@ +package pairmatching.controller; + +import pairmatching.domain.MatchingSystem; +import pairmatching.domain.type.*; +import pairmatching.view.InputView; +import pairmatching.view.OutputView; + +import java.util.List; + +public class MatchingController { + MatchingSystem matchingSystem = new MatchingSystem(); + + public void system() { + while (true) { + Command command = readCommand(); + if (command == Command.MATCHING) { + matching(); + } + if (command == Command.SELECT) { + select(); + } + if (command == Command.RESET) { + reset(); + } + if (command == Command.QUIT) { + break; + } + } + } + + private void matching() { + CourseLevelMission clmDto = readCourseLevelMission(); + try { + newMatching(clmDto); + } + catch(IllegalStateException e) { + if (readRematching()) { + reset(); + newMatching(clmDto); + } + } + } + + private void newMatching(CourseLevelMission clmDto) { + matchingSystem.matching(clmDto); + List pairs = findPairsByClm(clmDto); + OutputView.printMatchingResult(pairs); + } + + private void select() { + CourseLevelMission clmDto = readCourseLevelMission(); + List pairs = findPairsByClm(clmDto); + if (pairs.isEmpty()) { + OutputView.printError("아직 매칭 내용이 없습니다."); + } + if (!pairs.isEmpty()) { + OutputView.printMatchingResult(pairs); + } + } + + private void reset() { + matchingSystem.reset(); + OutputView.printResetDone(); + } + + private List findPairsByClm(CourseLevelMission clmDto) { + return matchingSystem.select(clmDto); + } + + private Command readCommand() { + while (true) { + try { + OutputView.printSelectCommand(); + return InputView.readCommand(); + } catch (IllegalArgumentException e) { + OutputView.printError(e.toString()); + } + } + } + + private CourseLevelMission readCourseLevelMission() { + while (true) { + try { + OutputView.printCourseLevelMission(); + return InputView.readCourseLevelMission(); + } catch (IllegalArgumentException e) { + OutputView.printError(e.toString()); + } + } + } + + private boolean readRematching() { + while (true) { + try { + OutputView.printRetry(); + return InputView.readRematching(); + } catch (IllegalArgumentException e) { + OutputView.printError(e.toString()); + } + } + } +} diff --git a/src/main/java/pairmatching/domain/MatchingSystem.java b/src/main/java/pairmatching/domain/MatchingSystem.java new file mode 100644 index 0000000..f1404ae --- /dev/null +++ b/src/main/java/pairmatching/domain/MatchingSystem.java @@ -0,0 +1,55 @@ +package pairmatching.domain; + +import camp.nextstep.edu.missionutils.Randoms; +import pairmatching.domain.type.CourseLevelMission; +import pairmatching.domain.type.Mission; +import pairmatching.domain.type.Pair; +import pairmatching.repository.CrewRepository; +import pairmatching.repository.PairRepository; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MatchingSystem { + private final CrewRepository crewRepository = new CrewRepository(); + private final PairRepository pairRepository = new PairRepository(); + + public void matching(CourseLevelMission clmDto) { + checkAlreadyMission(clmDto.getMission()); + + List crewNames = crewRepository.getCrew(clmDto.getCourse()); + List shuffledCrew = Randoms.shuffle(crewNames); + + for (Pair pair : groupingPairs(clmDto, shuffledCrew)) { + pairRepository.create(pair); + } + } + + private void checkAlreadyMission(Mission mission) { + if (pairRepository.isHaveMission(mission)) { + throw new IllegalStateException("이 미션은 이미 페어매칭 동작햇습니다~~ " + mission.toString()); + } + } + + private List groupingPairs(CourseLevelMission clmDto, List shuffledCrew) { + List result = new ArrayList<>(); + List queue = new ArrayList<>(); + for(String name : shuffledCrew) { + queue.add(name); + if (queue.size() == 2) { + result.add(new Pair(clmDto, queue)); + queue.clear(); + } + } + return result; + } + + public List select(CourseLevelMission clmDto) { + return pairRepository.findPairsByClm(clmDto); + } + + public void reset() { + pairRepository.deleteAll(); + } +} diff --git a/src/main/java/pairmatching/domain/ReadCrewFile.java b/src/main/java/pairmatching/domain/ReadCrewFile.java new file mode 100644 index 0000000..9bee2f8 --- /dev/null +++ b/src/main/java/pairmatching/domain/ReadCrewFile.java @@ -0,0 +1,19 @@ +package pairmatching.domain; + +import pairmatching.util.JavaFileReader; + +import java.util.List; + +public class ReadCrewFile { + private static final String RESOURCE_PATH = "src/main/resources/"; + private static final String BACKEND_PATH = RESOURCE_PATH + "backend-crew.md"; + private static final String FRONTEND_PATH = RESOURCE_PATH + "frontend-crew.md"; + + public static List readBackendCrew() { + return JavaFileReader.getLinesFromFile(BACKEND_PATH); + } + + public static List readFrontendCrew() { + return JavaFileReader.getLinesFromFile(FRONTEND_PATH); + } +} diff --git a/src/main/java/pairmatching/domain/type/Command.java b/src/main/java/pairmatching/domain/type/Command.java new file mode 100644 index 0000000..5f4ba14 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Command.java @@ -0,0 +1,28 @@ +package pairmatching.domain.type; + +import java.util.Arrays; +import java.util.Objects; + +public enum Command { + MATCHING("1"), + SELECT("2"), + RESET("3"), + QUIT("Q"); + + private final String command; + + Command(String command) { + this.command = command; + } + + public static Command of(String command) { + return Arrays.stream(Command.values()) + .filter(c -> Objects.equals(c.getCommand(), command)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("일치하는 커맨드가 없습니다. " + command)); + } + + private String getCommand() { + return command; + } +} diff --git a/src/main/java/pairmatching/domain/type/Course.java b/src/main/java/pairmatching/domain/type/Course.java new file mode 100644 index 0000000..24026b3 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Course.java @@ -0,0 +1,30 @@ +package pairmatching.domain.type; + +import java.util.Arrays; +import java.util.Objects; + +public enum Course { + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + + private String name; + + Course(String name) { + this.name = name; + } + + public static Course of(String name) { + return Arrays.stream(Course.values()) + .filter(course -> Objects.equals(course.getName(), name)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("course 값이 잘못되었씁니다. " + name)); + } + + public boolean isBackend() { + return this == BACKEND; + } + + private String getName() { + return name; + } +} diff --git a/src/main/java/pairmatching/domain/type/CourseLevelMission.java b/src/main/java/pairmatching/domain/type/CourseLevelMission.java new file mode 100644 index 0000000..f065f9e --- /dev/null +++ b/src/main/java/pairmatching/domain/type/CourseLevelMission.java @@ -0,0 +1,43 @@ +package pairmatching.domain.type; + +public class CourseLevelMission { + Course course; + Level level; + Mission mission; + + public CourseLevelMission(Course course, Level level, Mission mission) { + this.course = course; + this.level = level; + this.mission = mission; + } + + // TODO too many lines + public CourseLevelMission(String input) { + int i = 0; + for (String s : input.split(",")) { + s = s.trim(); + if (i == 0) { + course = Course.of(s); + } + if (i == 1) { + level = Level.of(s); + } + if (i == 2) { + mission = Mission.of(s); + } + i++; + } + } + + public Course getCourse() { + return course; + } + + public Level getLevel() { + return level; + } + + public Mission getMission() { + return mission; + } +} diff --git a/src/main/java/pairmatching/domain/type/Crew.java b/src/main/java/pairmatching/domain/type/Crew.java new file mode 100644 index 0000000..e32af52 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Crew.java @@ -0,0 +1,6 @@ +package pairmatching.domain.type; + +public class Crew { + private Course course; + private String name; +} diff --git a/src/main/java/pairmatching/domain/type/Level.java b/src/main/java/pairmatching/domain/type/Level.java new file mode 100644 index 0000000..027a694 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Level.java @@ -0,0 +1,31 @@ +package pairmatching.domain.type; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public enum Level { + LEVEL1("레벨1", List.of(Mission.CAR, Mission.LOTTO, Mission.BASEBALL)), + LEVEL2("레벨2", List.of(Mission.MARKET, Mission.PAY, Mission.BASEBALL)), + LEVEL3("레벨3", List.of()), + LEVEL4("레벨4", List.of(Mission.REFACTOR, Mission.RELEASE)), + LEVEL5("레벨5", List.of()); + + private String name; + private List missions; + + Level(String name, List missions) { + this.name = name; + } + + public static Level of(String name) { + return Arrays.stream(Level.values()) + .filter(level -> Objects.equals(level.getName(), name)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("level 값이 잘못되었씁니다. " + name)); + } + + private String getName() { + return name; + } +} diff --git a/src/main/java/pairmatching/domain/type/Mission.java b/src/main/java/pairmatching/domain/type/Mission.java new file mode 100644 index 0000000..279eea9 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Mission.java @@ -0,0 +1,32 @@ +package pairmatching.domain.type; + +import java.util.Arrays; +import java.util.Objects; + +public enum Mission { + CAR("자동차경주"), + LOTTO("로또"), + BASEBALL("숫자야구게임"), + MARKET("장바구니"), + PAY("결제"), + METRO("지하철노선도"), + REFACTOR("성능개선"), + RELEASE("배포"); + + private final String name; + + Mission(String name) { + this.name = name; + } + + public static Mission of(String name) { + return Arrays.stream(Mission.values()) + .filter(mission -> Objects.equals(mission.getName(), name)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("mission 값이 잘못되었씁니다. " + name)); + } + + private String getName() { + return name; + } +} diff --git a/src/main/java/pairmatching/domain/type/Pair.java b/src/main/java/pairmatching/domain/type/Pair.java new file mode 100644 index 0000000..ddb1588 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Pair.java @@ -0,0 +1,57 @@ +package pairmatching.domain.type; + +import java.util.List; +import java.util.stream.Collectors; + +public class Pair { + private final CourseLevelMission courseLevelMission; + private final List crew; + + public Pair(CourseLevelMission courseLevelMission, List crew) { + this.courseLevelMission = courseLevelMission; + this.crew = List.copyOf(crew); + } + + public boolean isSameCrew(Pair pair) { + if (crew.size() != pair.getCrew().size()) { + return false; + } + if (!crew.containsAll(pair.getCrew())) { + return false; + } + return true; + } + + public boolean isSameCourse(Course course) { + return courseLevelMission.getCourse() == course; + } + + public boolean isSameLevel(Level level) { + return courseLevelMission.getLevel() == level; + } + + public boolean isSameLevel(Pair pair) { + return courseLevelMission.getLevel() == pair.getCourseLevelMission().getLevel(); + } + + public boolean isSameMission(Mission mission) { + return courseLevelMission.getMission() == mission; + } + + public boolean isSameMission(Pair pair) { + return courseLevelMission.getMission() == pair.getCourseLevelMission().getMission(); + } + + private CourseLevelMission getCourseLevelMission() { + return courseLevelMission; + } + + private List getCrew() { + return crew; + } + + @Override + public String toString() { + return String.join(" : ", crew); + } +} diff --git a/src/main/java/pairmatching/domain/type/Rematching.java b/src/main/java/pairmatching/domain/type/Rematching.java new file mode 100644 index 0000000..6074668 --- /dev/null +++ b/src/main/java/pairmatching/domain/type/Rematching.java @@ -0,0 +1,34 @@ +package pairmatching.domain.type; + +import java.util.Arrays; +import java.util.Objects; + +public enum Rematching { + YES("네", true), + NO("아니오", false); + + private final String word; + private final boolean isYes; + + + Rematching(String word, boolean isYes) { + this.word = word; + this.isYes = isYes; + } + + public static boolean wordIsYes(String word) { + return Arrays.stream(Rematching.values()) + .filter(rematching -> Objects.equals(rematching.getWord(), word)) + .findAny() + .map(Rematching::getIsYes) + .orElseThrow(() -> new IllegalArgumentException("일치하는 리매칭 커맨드가 없습니다. " + word)); + } + + private String getWord() { + return word; + } + + private boolean getIsYes() { + return isYes; + } +} diff --git a/src/main/java/pairmatching/repository/CrewRepository.java b/src/main/java/pairmatching/repository/CrewRepository.java new file mode 100644 index 0000000..73c99c7 --- /dev/null +++ b/src/main/java/pairmatching/repository/CrewRepository.java @@ -0,0 +1,23 @@ +package pairmatching.repository; + +import pairmatching.domain.ReadCrewFile; +import pairmatching.domain.type.Course; + +import java.util.List; + +public class CrewRepository { + List backendCrew; + List frontendCrew; + + public CrewRepository() { + backendCrew = ReadCrewFile.readBackendCrew(); + frontendCrew = ReadCrewFile.readFrontendCrew(); + } + + public List getCrew(Course course) { + if (course.isBackend()) { + return backendCrew; + } + return frontendCrew; + } +} diff --git a/src/main/java/pairmatching/repository/PairRepository.java b/src/main/java/pairmatching/repository/PairRepository.java new file mode 100644 index 0000000..d39c09d --- /dev/null +++ b/src/main/java/pairmatching/repository/PairRepository.java @@ -0,0 +1,45 @@ +package pairmatching.repository; + +import pairmatching.domain.type.CourseLevelMission; +import pairmatching.domain.type.Mission; +import pairmatching.domain.type.Pair; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class PairRepository { + List pairs = new ArrayList(); + + // create item + public void create(Pair pair) { + validateSameLevelPair(pair); // 같은레벨에 중복크루가 이미 있는지 확인 + pairs.add(pair); + } + + public boolean isHaveMission(Mission mission) { + return pairs.stream().anyMatch(p -> p.isSameMission(mission)); + } + + private void validateSameLevelPair(Pair pair) { + pairs.stream() + .filter(p -> p.isSameLevel(pair)) + .filter(p -> p.isSameCrew(pair)) + .findAny() + .ifPresent(p -> {throw new IllegalStateException("이미 중복된 크루가 있습니다~~ " + p.toString());}); + } + + // find all + public List findPairsByClm(CourseLevelMission clmDto) { + return pairs.stream() + .filter(pair -> pair.isSameCourse(clmDto.getCourse())) + .filter(pair -> pair.isSameLevel(clmDto.getLevel())) + .filter(pair -> pair.isSameMission(clmDto.getMission())) + .collect(Collectors.toList()); + } + + // delete all + public void deleteAll() { + pairs = new ArrayList(); + } +} diff --git a/src/main/java/pairmatching/util/JavaFileReader.java b/src/main/java/pairmatching/util/JavaFileReader.java new file mode 100644 index 0000000..9887353 --- /dev/null +++ b/src/main/java/pairmatching/util/JavaFileReader.java @@ -0,0 +1,44 @@ +package pairmatching.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class JavaFileReader { + public static List getLinesFromFile(String path) { + List lines = new ArrayList<>(); + try { + File file = getFile(path); + lines = getLines(file); + } catch (FileNotFoundException e) { + System.out.println(e); + } catch (IOException e) { + System.out.println(e); + } + return lines; + } + + private static List getLines(File file) throws IOException { + List lines = new ArrayList<>(); + // 입력 스트림 및 버퍼 생성 + FileReader filereader = new FileReader(file); + BufferedReader bufReader = new BufferedReader(filereader); + // 파일 읽기 + String line = ""; + while ((line = bufReader.readLine()) != null) { + lines.add(line); + } + bufReader.close(); + + return lines; + } + + private static File getFile(String path) throws FileNotFoundException { + //파일 객체 생성 + return new File(path); + } +} diff --git a/src/main/java/pairmatching/view/InputView.java b/src/main/java/pairmatching/view/InputView.java new file mode 100644 index 0000000..53b508b --- /dev/null +++ b/src/main/java/pairmatching/view/InputView.java @@ -0,0 +1,23 @@ +package pairmatching.view; + +import camp.nextstep.edu.missionutils.Console; +import pairmatching.domain.type.Command; +import pairmatching.domain.type.CourseLevelMission; +import pairmatching.domain.type.Rematching; + +public class InputView { + public static Command readCommand() { + String input = Console.readLine(); + return Command.of(input); + } + + public static CourseLevelMission readCourseLevelMission() { + String input = Console.readLine(); + return new CourseLevelMission(input); + } + + public static boolean readRematching() { + String input = Console.readLine(); + return Rematching.wordIsYes(input); + } +} diff --git a/src/main/java/pairmatching/view/OutputView.java b/src/main/java/pairmatching/view/OutputView.java new file mode 100644 index 0000000..aa8d886 --- /dev/null +++ b/src/main/java/pairmatching/view/OutputView.java @@ -0,0 +1,50 @@ +package pairmatching.view; + +import pairmatching.domain.type.Pair; + +import java.util.List; + +public class OutputView { + public static void printSelectCommand() { + System.out.println( + "기능을 선택하세요.\n" + + "1. 페어 매칭\n" + + "2. 페어 조회\n" + + "3. 페어 초기화\n" + + "Q. 종료"); + } + + public static void printCourseLevelMission() { + System.out.println( + "#############################################\n" + + "과정: 백엔드 | 프론트엔드\n" + + "미션:\n" + + " - 레벨1: 자동차경주 | 로또 | 숫자야구게임\n" + + " - 레벨2: 장바구니 | 결제 | 지하철노선도\n" + + " - 레벨3: \n" + + " - 레벨4: 성능개선 | 배포\n" + + " - 레벨5: \n" + + "############################################\n" + + "과정, 레벨, 미션을 선택하세요.\n" + + "ex) 백엔드, 레벨1, 자동차경주" + ); + } + + public static void printMatchingResult(List pairs) { + System.out.println("페어 매칭 결과입니다."); + pairs.forEach(pair -> System.out.println(pair.toString())); + } + + public static void printRetry() { + System.out.println("매칭 정보가 있습니다. 다시 매칭하시겠습니까?\n" + + "네 | 아니오"); + } + + public static void printResetDone() { + System.out.println("초기화 되었습니다."); + } + + public static void printError(String e) { + System.out.println("[ERROR] " + e); + } +}