Skip to content
168 changes: 168 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,3 +208,171 @@ String menu = Randoms.shuffle(menus).get(0);
- 과제 진행 및 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse)
문서를 참고한다.
- 소감은 간소하게 입력해도 된다. 예를 들어, "."만 입력해도 좋다.


# 주의 사항 리마인더

- 월, 화, 수, 목 ,금
- 요일 별 추천 카테고리 지정
- → 코치가 해당 요일에 먹을 메뉴 추천
- 코치 이름 입력 값
- 최소 2글자 최대 4글자
- 코치는 2~5명 동시 식사
- 랜덤 생성기에서
- 1 → 일식
- 2 → 한식
- 3 → 중식
- 4 → 아시안
- 5 → 양식

메뉴

- 한 주에 같은 카테고리는 최대 2회
- 한 주 동안 중복되지 않은 메뉴를 추천
- 못먹는 음식이면 추천 불가

→ 다시 난수 생성해서 카테고리 생성


예상 되는 기능 목록

- 코치 이름 입력 받기
- 못 먹는 메뉴 입력 받기
- 카테고리 추천하기
- 메뉴 추천하기
- 메뉴 출력하기

# 서비스 흐름

1. 코치 이름 입력 받기
1. List로 갖고 있기
2. 못 먹는 메뉴 입력 받기
1. List로 갖고 있기
3. 카테고리 추천 돌리기
4. 카테고리에 따라서 메뉴 추천 돌리기
1. List로 반환하기
5. 이름, 메뉴, 리스트로 객체 생성하기
6. 출력하기

# 기능 목록

### 코치 이름 입력

입력

- 이름 입력 받기
1. 형식 에러
1. 최소 2글자 최대 4글자
2. 최소 2명 이상

로직

출력

- 없음

반환

- 데이터 자료형 : String

### 못 먹는 메뉴 입력

입력

- 메뉴 입력 받기
1. 형식 에러

로직

- 코치에 해당 메뉴 저장하기

출력

- 없음

반환

- List<String>

### 카테고리 추천

입력

- 없음

로직

- 랜덤 함수를 통해서 카테고리 생성
- 월,화,수,목,금 → 5개 생성
- 같은 값이 2개 이상이면 에러
-

출력

- 없음

반환

- 데이터 자료형 : List<String>

### 메뉴 추천

1. 코치별로 카테고리 순서에 맞게 메뉴 추천(선택)
2. 카테고리별로 메뉴 추천후 코치별 배정

입력

-

로직

- 카테고리 에 따른 메뉴 목록 전달 받기
- 랜덤 함수로 메뉴 가져오기
- 해당 메뉴가 금지 메뉴이면 다시 생성
- 코치별 메뉴 리스트 저장

출력

- 없음

반환

- 코치별 메뉴 리스트 반환
- 데이터 자료형 : List<String>

### 결과 출력

입력

-

로직

- 객체에서 이름, 메뉴 받아오기

출력

- 이름
- 메뉴 출력

반환

- 없음

# 데이터

### 코치

- 코치 이름
- 못 먹는 메뉴
- List<String>
- 추천 받은 메뉴
- List<String>

### 메뉴

enum

### 카테고리

enum
127 changes: 120 additions & 7 deletions src/main/java/menu/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,120 @@
package menu;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
}
}
//package menu;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//import javax.swing.SwingUtilities;
//import menu.domain.Coach;
//import menu.domain.Menu;
//import menu.domain.RandomCategoryNumberGenerator;
//import menu.domain.RandomNumberGenerator;
//import menu.service.CategoryRecommendService;
//import menu.service.MenuRecommendService;
//import menu.view.InputView;
//import menu.view.OutputView;
//
//public class Application {
// public static void main(String[] args) {
// // TODO: 프로그램 구현
// RandomNumberGenerator RandomCategoryNumberGenerator = new RandomCategoryNumberGenerator();
// CategoryRecommendService categoryRecommendService = new CategoryRecommendService(RandomCategoryNumberGenerator);
// MenuRecommendService menuRecommendService = new MenuRecommendService();
// InputView inputView = new InputView();
// OutputView outputView = new OutputView();
//
//
// // 코치 이름 입력
// outputView.printStartMessage();
// String[] coachNames = inputView.readCoachNames();
//
// // 카테고리 추천 돌리기
// int[] categories = categoryRecommendService.recommendCategory();
//
// List<String> categoryNames = categoryRecommendService.recommendCategoryList();
//
//
// // 디버그 코드
//// System.out.println("카테고리 넘버 확인용");
//// for(int i = 0 ; i < categories.length; i++){
//// System.out.println( categories[i] );
//// }
//// System.out.println("카테고리 넘버 확인 끝");
//
// // 디버그 코드
// System.out.println("카테고리 ");
// for(String categoryName : categoryNames) {
// System.out.println(categoryName);
// }
//
//
//
// // 코치 정보 리스트
// List<Coach> coachList = new ArrayList<>();
//
// // 코치 수 만큼 반복
// // 순서대로 계속 뽑음 그러니까 한마디로
// // 한 코치당 한번 끝나는게 아니었음
//
// for (String coachName : coachNames) {
// System.out.println("코치이름 : " + coachName);
// // 못 먹는 메뉴 입력 받기
// String[] rejectedMenu = inputView.readRejectedMenu(coachName);
//
// // 디버그 코드
// // 못 먹는 메뉴 출력
// System.out.println("못 먹는 메뉴 출력");
// for (String rejectedMenuName : rejectedMenu) {
// System.out.println(rejectedMenuName);
// }
// System.out.println("출력 완료");
//
// // 메뉴 추천 정보를 저장하기 위한 새로운 리스트
// List<String> recommendedMenuList = new ArrayList<>();
// //
// // 월,화,수,목,금 총 5회 메뉴 추천
// for (int categoryNum : categories) {
//
// // 카테고리에 해당하는 메뉴 리스트 조회
// List<String> menus = Arrays.stream(Menu.values())
// .filter(val -> val.getId() == categoryNum)
// .findFirst()
// .orElse(null)
// .getMenu();
//
// // 메뉴 중에서 랜덤 메뉴 추천
// String recommendedMenu = menuRecommendService.recommendMenu(menus);
// System.out.println(categoryNum + " 카테고리 음식 추천 " + recommendedMenu);
// // 메뉴에 저장
// recommendedMenuList.add(recommendedMenu);
// }
//
// // 정보를 통해 코치 객체 생성
// Coach coach = new Coach(coachName, recommendedMenuList);
//
// // 리스트에 저장
// coachList.add(coach);
// }
//
//
// List<String> categoryList = new ArrayList<>();
// for(int categoryNum : categories) {
// String category = Arrays.stream(Menu.values())
// .filter(val -> val.getId() == categoryNum)
// .findFirst()
// .orElse(null)
// .getCategory();
// categoryList.add(category);
// }
//
// // 결과 출력 부
// outputView.printResult();
// outputView.printCategory(categoryList);
// for(Coach coach : coachList) {
// String name = coach.getName();
// List<String> menu = coach.getRecommendedMenu();
// outputView.printMenu(name, menu);
// }
// System.out.println();
// outputView.printEndMessage();
// }
//}
78 changes: 78 additions & 0 deletions src/main/java/menu/Application2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package menu;

import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import menu.domain.Coach;
import menu.domain.Menu;
import menu.domain.RandomCategoryNumberGenerator;
import menu.domain.RandomNumberGenerator;
import menu.service.CategoryRecommendService;
import menu.service.MenuRecommendService;
import menu.util.InputHandler;
import menu.view.InputView;
import menu.view.OutputView;
import org.mockito.exceptions.misusing.CannotVerifyStubOnlyMock;

public class Application2 {
public static void main(String[] args) {
// TODO: 프로그램 구현
RandomNumberGenerator RandomCategoryNumberGenerator = new RandomCategoryNumberGenerator();
CategoryRecommendService categoryRecommendService = new CategoryRecommendService(RandomCategoryNumberGenerator);
OutputView outputView = new OutputView();

// 코치 이름 입력
outputView.printStartMessage();
List<String> coachNames = InputHandler.retry(InputView::readCoachNames);

// 카테고리 추천 돌리기
List<String> categoryNames = categoryRecommendService.recommendCategoryList();

// 코치 정보 리스트
List<Coach> coachList = new ArrayList<>();
for(String coachName : coachNames) {
List<String> rejectedMenu = InputView.readRejectedMenu(coachName);
Coach coach = new Coach(coachName, rejectedMenu);
coachList.add(coach);
}

// 요일(카테고리) 별로 반복
for(String categoryName : categoryNames) {

// 코치 별로 추천하기
for(Coach coach : coachList) {

// 카테고리 메뉴 조회
List<String> menus = Arrays.stream(Menu.values())
.filter(val -> val.getCategory().equals(categoryName))
.findFirst()
.orElse(null)
.getMenu();

while(true){
String recommendMenu = Randoms.shuffle(menus).get(0);
//이미 추천 한 경우
if(coach.getRejectedMenu().contains(recommendMenu)
|| coach.getRecommendedMenu().contains(recommendMenu)){
continue;
}
coach.addRecommendedMenu(recommendMenu);
break;
}
}
}


// 결과 출력 부
outputView.printResult();
outputView.printCategory(categoryNames);
for(Coach coach : coachList) {
String name = coach.getName();
List<String> menu = coach.getRecommendedMenu();
outputView.printMenu(name, menu);
}
System.out.println();
outputView.printEndMessage();
}
}
Loading