Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
2eb8576
docs: 기능 구현 목록 정리
helloworldjay Dec 19, 2020
722b332
feat: 프로그램 기본 설정 초기화 구현
helloworldjay Dec 19, 2020
7e47547
feat: 시작 메인 화면 출력 구현
helloworldjay Dec 19, 2020
2be78c1
feat: 잘못된 입력 검사 기능 추가
helloworldjay Dec 19, 2020
1877d9b
feat: 경로 선택 화면 구현
helloworldjay Dec 19, 2020
a2ae1b1
feat: 사용자 입력 화면 구현
helloworldjay Dec 19, 2020
1900229
feat: 입출력 화면 실행을 위한 메인 화면 구현
helloworldjay Dec 19, 2020
5998efe
refactor: 출발역과 도착역 입력 오류 검사 기능 추가
helloworldjay Dec 19, 2020
de9f2d1
feat: 프로그램 초기화 및 실행 구현
helloworldjay Dec 19, 2020
bae9256
refactor: 이름으로 역 존재를 확인하는 기능 추가
helloworldjay Dec 19, 2020
a798359
styles: 메소드 이름 변경
helloworldjay Dec 19, 2020
bb6104f
refactor: 역이름을 노선에 등록하는 기능 구현
helloworldjay Dec 19, 2020
f2be630
styles: Convention에 맞게 공백 제거
helloworldjay Dec 19, 2020
74e9286
styles: Convention에 맞게 공백 제거
helloworldjay Dec 19, 2020
85c2b24
feat: 거리 기준속도 계산 Repository 생성
helloworldjay Dec 19, 2020
4b00bfb
feat: 시간 기준속도 계산 Repository 생성
helloworldjay Dec 19, 2020
4f21635
feat: 최단 시간 경로 계산 기능 구현
helloworldjay Dec 19, 2020
648dca5
feat: 최단 거리 경로 계산 기능 구현
helloworldjay Dec 19, 2020
e51f58f
feat: 입력 화면 구현
helloworldjay Dec 19, 2020
fc73a53
feat: 출력 화면 구현
helloworldjay Dec 19, 2020
13057ae
feat: 메인 화면 구현
helloworldjay Dec 19, 2020
2f41ac8
refactor: 에러 검사 기능 변경
helloworldjay Dec 19, 2020
b81fdeb
feat: 메인 실행 기능 구현
helloworldjay Dec 19, 2020
1858dbe
feat: 초기화 기능 구현
helloworldjay Dec 19, 2020
401cc24
docs: 기능 구현 목록 체크리스트 완성
helloworldjay Dec 19, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
미션 - 지하철 노선도 경로 조회 미션
========================

우아한테크코스 프리코스 온라인 테스트
------------------------

<br>


### 지하철 노선도 경로 조회 미션

```
목표 : 등록된 지하철 노선도에서 경로를 조회하는 기능을 구현한다.
```


<br>

***

<br>

### 기능 구현 목록

1. [x] 프로그램 시작 시 주어진 역, 노선, 구간 정보로 초기 설정을 한다.


1. [x] 시작 화면을 출력 클래스에 구현한다.


1. [x] 원하는 기능을 선택하는 화면을 구현한다.
- [예외사항] 사용자 입력이 주어진 선택지가 아닌 값으로 입력된다.(공백 포함)


1. [X] 경로 기준을 선택하는 화면을 구현한다.


1. [x] 출발역을 입력받는 화면을 구현한다.
- [예외사항] 출발역이 역 목록에 존재하지 않는다.


1. [x] 도착역을 입력받는 화면을 구현한다.
- [예외사항] 도착역이 역 목록에 존재하지 않는다.
- [예외사항] 도착역이 입력받은 출발역과 같다.


1. [x] 조회 결과를 출력하는 화면을 구현한다.


1. [x] 거리를 기준으로 최단거리 경로를 연산하는 클래스를 구현한다.


1. [x] 시간을 기준으로 최단시간 경로를 연산하는 클래스를 구현한다.




<br>

***

<br>

## 📝 License

This project is [MIT](https://github.com/woowacourse/java-subway-path-precourse/blob/master/LICENSE.md) licensed.
3 changes: 3 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package subway;

import java.util.Scanner;
import subway.Controller.SubwayRouteSearcher;

public class Application {

public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
SubwayRouteSearcher.startProgram(scanner);
}
}
70 changes: 70 additions & 0 deletions src/main/java/subway/Controller/Initializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package subway.Controller;

import java.util.Arrays;
import java.util.List;
import subway.domain.DistanceWeightRepository;
import subway.domain.Line;
import subway.domain.LineRepository;
import subway.domain.Station;
import subway.domain.StationRepository;
import subway.domain.TimeWeightRepository;

public class Initializer {

private static List<String> INITIALSTATION = Arrays
.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역");
private static List<String> INITIALLINE = Arrays.asList("2호선", "3호선", "신분당선");
private static List<String> LINETWO = Arrays.asList("교대역", "강남역", "역삼역");
private static int[] LINETWOTIME = {2, 3};
private static int[] LINETWODISTANCE = {3, 3};
private static List<String> LINETHREE = Arrays.asList("교대역", "남부터미널역", "양재역", "매봉역");
private static int[] LINETHREETIME = {3, 6, 1};
private static int[] LINETHREEDISTANCE = {2, 5, 1};
private static List<String> LINESHINBUNDANG = Arrays.asList("강남역", "양재역", "양재시민의숲역");
private static int[] LINESHINBUNDANGTIME = {2, 10};
private static int[] LINESHINBUNDANGDISTANCE = {8, 3};
private static List<List<String>> INITIALLINESTATION = Arrays
.asList(LINETWO, LINETHREE, LINESHINBUNDANG);

public static void setInitializeBaseSetting() {
setInitializeLine(INITIALLINE);
setInitializeStation(INITIALSTATION);
setInitialVertex(INITIALSTATION);
setInitialWeight(LINETWO, LINETWOTIME, LINETWODISTANCE);
setInitialWeight(LINETHREE, LINETHREETIME, LINETHREEDISTANCE);
setInitialWeight(LINESHINBUNDANG, LINESHINBUNDANGTIME, LINESHINBUNDANGDISTANCE);
}

private static void setInitializeStation(List<String> INITIALSTATION) {
for (String stationName : INITIALSTATION) {
Station station = new Station(stationName);
StationRepository.addStation(station);
}
}

private static void setInitializeLine(List<String> INITIALLINE) {
for (int i = 0; i < INITIALLINE.size(); i++) {
Line line = new Line(INITIALLINE.get(i));
line.addLineStation(INITIALLINESTATION.get(i));
LineRepository.addLine(line);
}
}

private static void setInitialVertex(List<String> stationNames) {
for (String stationName : stationNames) {
TimeWeightRepository.addStation(stationName);
DistanceWeightRepository.addStation(stationName);
}
}

private static void setInitialWeight(List<String> lineNumber, int[] timeWeight,
int[] distanceWeight) {
for (int i = 0; i < lineNumber.size() - 1; i++) {
TimeWeightRepository
.setStationEdgeTime(lineNumber.get(i), lineNumber.get(i + 1), timeWeight[i]);
DistanceWeightRepository
.setStationEdgeDistance(lineNumber.get(i), lineNumber.get(i + 1),
distanceWeight[i]);
}
}
}
21 changes: 21 additions & 0 deletions src/main/java/subway/Controller/MinDistanceCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package subway.Controller;

import java.util.List;
import java.util.Scanner;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.WeightedMultigraph;
import subway.Views.MainView;
import subway.Views.OutputView;
import subway.domain.DistanceWeightRepository;

public class MinDistanceCalculator {

public static void calculateMinDistance(Scanner scanner) {
String startStation = MainView.printStartStation(scanner);
String endStation = MainView.printEndStation(scanner, startStation);

List<String> result = DistanceWeightRepository
.getDijkstraShortestPath(startStation, endStation);
MainView.printResultScreen(scanner, result);
}
}
18 changes: 18 additions & 0 deletions src/main/java/subway/Controller/MinTimeCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package subway.Controller;

import java.util.List;
import java.util.Scanner;
import subway.Views.MainView;
import subway.Views.OutputView;
import subway.domain.DistanceWeightRepository;

public class MinTimeCalculator {

public static void calculateMinTime(Scanner scanner) {
String startStation = MainView.printStartStation(scanner);
String endStation = MainView.printEndStation(scanner, startStation);
List<String> result =
DistanceWeightRepository.getDijkstraShortestPath(startStation, endStation);
MainView.printResultScreen(scanner, result);
}
}
30 changes: 30 additions & 0 deletions src/main/java/subway/Controller/SubwayRouteSearcher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package subway.Controller;

import java.util.Scanner;
import subway.Views.MainView;

public class SubwayRouteSearcher {

public static void startProgram(Scanner scanner) {
Initializer.setInitializeBaseSetting();
MainView.printMainScreen(scanner);
}

public static void selectMain(Scanner scanner, String userMainSelection) {
if (userMainSelection.equals("1")) {
MainView.printRouteScreen(scanner);
}
}

public static void selectRoute(Scanner scanner, String userRouteSelection) {
if (userRouteSelection.equals("1")) {
MinDistanceCalculator.calculateMinDistance(scanner);
}
if (userRouteSelection.equals("2")) {
MinTimeCalculator.calculateMinTime(scanner);
}
if (userRouteSelection.equals("B")) {
MainView.printMainScreen(scanner);
}
}
}
25 changes: 25 additions & 0 deletions src/main/java/subway/Views/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package subway.Views;

import java.util.Scanner;

public class InputView {

private final static String FUNCTIONSELECTION = "## 원하는 기능을 선택하세요.";
private final static String STARTSTATION = "## 출발역을 입력하세요.";
private final static String ENDSTATION = "## 도착역을 입력하세요.";

protected static String getUserInput(Scanner scanner) {
System.out.println(FUNCTIONSELECTION);
return scanner.nextLine();
}

protected static String getStartStation(Scanner scanner) {
System.out.println(STARTSTATION);
return scanner.nextLine();
}

protected static String getEndStation(Scanner scanner) {
System.out.println(ENDSTATION);
return scanner.nextLine();
}
}
94 changes: 94 additions & 0 deletions src/main/java/subway/Views/MainView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package subway.Views;

import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import subway.Controller.SubwayRouteSearcher;
import subway.utils.ErrorValidator;

public class MainView {

private final static List<String> MAINSELECTLIST = Arrays.asList("1", "Q");
private final static List<String> ROUTESELECTLIST = Arrays.asList("1", "2", "B");

public static void printMainScreen(Scanner scanner) {
OutputView.printMainSelection();
String userMainSelection = InputView.getUserInput(scanner);
System.out.println();
checkUserInput(scanner, userMainSelection, MAINSELECTLIST);
SubwayRouteSearcher.selectMain(scanner, userMainSelection);
}

public static void printRouteScreen(Scanner scanner) {
OutputView.printRouteSelection();
String userRouteSelection = InputView.getUserInput(scanner);
System.out.println();
checkUserInput(scanner, userRouteSelection, ROUTESELECTLIST);
SubwayRouteSearcher.selectRoute(scanner, userRouteSelection);
}

public static void printResultScreen(Scanner scanner, List<String> resultList) {
OutputView.printResultRoute(resultList);
System.out.println();
MainView.printMainScreen(scanner);
}


private static void checkUserInput(Scanner scanner, String userSelection,
List<String> SELECTLIST) {
try {
ErrorValidator.checkMainSelection(SELECTLIST, userSelection);
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println();
printMainScreen(scanner);
}
}

public static String printStartStation(Scanner scanner) {
String startStaion = InputView.getStartStation(scanner);
System.out.println();
checkStartStation(scanner, startStaion);
return startStaion;
}

public static String printEndStation(Scanner scanner, String startStation) {
String endStaion = InputView.getEndStation(scanner);
System.out.println();
checkEndStation(scanner, endStaion);
checkStartEndStation(scanner, startStation, endStaion);
return endStaion;
}

private static void checkStartEndStation(Scanner scanner, String startStation,
String endStaion) {
try {
ErrorValidator.checkStartEndStation(startStation, endStaion);
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println();
printMainScreen(scanner);
}
}

private static void checkStartStation(Scanner scanner, String startStaion) {
try {
ErrorValidator.checkStationRepository(startStaion);
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println();
printMainScreen(scanner);
}
}

private static void checkEndStation(Scanner scanner, String endStaion) {
try {
ErrorValidator.checkStationRepository(endStaion);
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println();
printMainScreen(scanner);
}
}
}
47 changes: 47 additions & 0 deletions src/main/java/subway/Views/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package subway.Views;

import java.util.List;
import java.util.Scanner;

public class OutputView {

private final static String MAINSCREEN = "## 메인 화면";
private final static String ROUTESEARCHSELECTION = "1. 경로 조회";
private final static String PROGRAMEXIT = "Q. 종료";
private final static String ROUTESCREEN = "## 경로 기준";
private final static String MINDISTANCEROUTE = "1. 최단 거리";
private final static String MINTIMEROUTE = "2. 최소 시간";
private final static String BACKOPTION = "B. 돌아가기";
private final static String RESULTSCREEN = "## 조회 결과";
private final static String INFORMATION = "[INFO] ";
private final static String SPLITLINE = "---";
private final static String TOTALDISTANCE = "총 거리: %dkm";
private final static String TOTALTIME = "총 소요 시간: %d분";


protected static void printMainSelection() {
System.out.println(MAINSCREEN);
System.out.println(ROUTESEARCHSELECTION);
System.out.println(PROGRAMEXIT);
System.out.println();
}

protected static void printRouteSelection() {
System.out.println(ROUTESCREEN);
System.out.println(MINDISTANCEROUTE);
System.out.println(MINTIMEROUTE);
System.out.println(BACKOPTION);
System.out.println();
}

protected static void printResultRoute(List<String> resultList) {
System.out.println(RESULTSCREEN);
System.out.println(INFORMATION + SPLITLINE);
// System.out.println(String.format(INFORMATION + TOTALDISTANCE, totalDistance));
// System.out.println(String.format(INFORMATION + TOTALTIME, totalTime));
// System.out.println(INFORMATION + SPLITLINE);
for (String result : resultList) {
System.out.println(INFORMATION + result);
}
}
}
Loading