Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
32 changes: 32 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## 기능목록


### Domain
####역
- 기본 셋팅 역 정보 저장
####라인
- 라인 별 역 저장
- 라인 별 시간 저장
- 라인 별 거리 저장
- 기본 셋팅 라인 저장
- 역 간 거리 계산
- 특정 역이 라인에 존재하는지에 대한 여부 확인

### View
- InputView
- OutputView

### Controller
- 메인화면 기능 선택
- 최단 거리 경로 선택
- 최소 시간 경로 선택
- 조회 경로 출력
- 경로 기준 화면 선택

### Exception
- 출발역과 도착역이 같으면 에러 처리
- 출박역과 도착역이 이어지지 않았다면 에러 처리
- 존재하지 않는 역 사용시 에러 처리
- 기능 선택 시 입력 값이 메뉴 네임이 아닌경우 에러처리


4 changes: 4 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package subway;

import subway.Controller.MainController;

import java.util.Scanner;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
new MainController(scanner);
}

}
83 changes: 83 additions & 0 deletions src/main/java/subway/Controller/ComputeShortValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package subway.Controller;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.WeightedMultigraph;

import subway.View.OutputView;
import subway.domain.Line;
import subway.domain.LineRepository;
import subway.domain.Station;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ComputeShortValue {
private static List<Line> allLine=LineRepository.lines();
List<String> checkDuplicatedStation=new ArrayList<String>();
LineRepository lineRepository=new LineRepository();
WeightedMultigraph<String, DefaultWeightedEdge> distanceGraph = new WeightedMultigraph(DefaultWeightedEdge.class);
WeightedMultigraph<String, DefaultWeightedEdge> timeGraph = new WeightedMultigraph(DefaultWeightedEdge.class);

public void setDistanceGraph(String start,String end) {


setAllLine(distanceGraph);
setDistanceEdge(distanceGraph);
DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceGraph);
List<String> shortestPath = dijkstraShortestPath.getPath(start, end).getVertexList();

OutputView outputView =new OutputView();
outputView.printStation(shortestPath);

}
public void setTimeGraph(String start,String end) {
setAllLine(timeGraph);
setTimeEdge(timeGraph);
DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceGraph);
List<String> shortestPath = dijkstraShortestPath.getPath(start, end).getVertexList();

OutputView outputView =new OutputView();
outputView.printStation(shortestPath);
}
public void setDistanceEdge(WeightedMultigraph<String, DefaultWeightedEdge> tmpGraph) {

for(int i=0;i<allLine.size();i++) {
Line tmpSaveLine=allLine.get(i);
for (int j = 0; j < tmpSaveLine.getLineStation().size()-1; j++) {

tmpGraph.setEdgeWeight(tmpGraph.addEdge(tmpSaveLine.getLineStation().get(j).getName(),tmpSaveLine.getLineStation().get(j+1).getName()),lineRepository.getLine(tmpSaveLine.getName()).getDistance(tmpSaveLine.getLineStation().get(j),tmpSaveLine.getLineStation().get(j+1)));

}
}
}
public void setTimeEdge(WeightedMultigraph<String, DefaultWeightedEdge> tmpGraph) {

for(int i=0;i<allLine.size();i++) {
Line tmpSaveLine=allLine.get(i);
for (int j = 0; j < tmpSaveLine.getLineStation().size()-1; j++) {

tmpGraph.setEdgeWeight(tmpGraph.addEdge(tmpSaveLine.getLineStation().get(j).getName(),tmpSaveLine.getLineStation().get(j+1).getName()),lineRepository.getLine(tmpSaveLine.getName()).getDistance(tmpSaveLine.getLineStation().get(j),tmpSaveLine.getLineStation().get(j+1)));

}
}
}
public void setAllLine(WeightedMultigraph<String, DefaultWeightedEdge> tmpGraph) {

for(int i=0;i<allLine.size();i++) {

Line tmpSaveLine=allLine.get(i);
for(int j=0;j<tmpSaveLine.getLineStation().size();j++) {
setCheckDuplicatedStation(allLine.get(i).getLineStation().get(j),tmpGraph);
}
}
}
public void setCheckDuplicatedStation(Station tmpSaveStation,WeightedMultigraph<String, DefaultWeightedEdge> tmpGraph) {
if(!checkDuplicatedStation.contains(tmpSaveStation.getName())){
checkDuplicatedStation.add(tmpSaveStation.getName());

tmpGraph.addVertex(tmpSaveStation.getName());
}
}

}
74 changes: 74 additions & 0 deletions src/main/java/subway/Controller/MainController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package subway.Controller;


import subway.View.InputView;
import subway.View.OutputView;
import subway.domain.LineRepository;
import subway.domain.Station;
import subway.domain.StationRepository;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import subway.domain.Line;

public class MainController {
private static final String MAIN_CONTROLLER_MENU_QUIT="Q";
private static final String MAIN_CONTROLLER_PATH_SEARCH="1";
private static final List<String> STATION= Arrays.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역");
private static final List<String> line=Arrays.asList("2호선","3호선","신분당선");
Scanner scanner;
OutputView outputView=new OutputView();
InputView inputView=new InputView();
PathController pathController=new PathController();
LineRepository lineRepository=new LineRepository();

public MainController(Scanner scanner){
this.scanner=scanner;
initializeSubwayLine();
initializeSubwayStation();
initializeDistance();
initializeTime();
startMainMenu(scanner);

}
public void startMainMenu(Scanner scanner) {
while(true) {

outputView.setMainMenuMainDisplay();
String tmpSaveMenuChoice = inputView.getChooseFunction(scanner);
if (tmpSaveMenuChoice.equals(MAIN_CONTROLLER_MENU_QUIT)) {
break;
}
if (tmpSaveMenuChoice.equals(MAIN_CONTROLLER_PATH_SEARCH)) {
pathController.startPathMenu(scanner);
continue;
}
}
}
public void initializeSubwayStation() {
for(int i=0;i<STATION.size();i++) {
StationRepository.addStation(new Station(STATION.get(i)));
}
}
public void initializeSubwayLine() {
lineRepository.initializeLine(line.get(0),Arrays.asList(STATION.get(0),STATION.get(1),STATION.get(2)));
lineRepository.initializeLine(line.get(1),Arrays.asList(STATION.get(0),STATION.get(3),STATION.get(4),STATION.get(6)));
lineRepository.initializeLine(line.get(2),Arrays.asList(STATION.get(1),STATION.get(4),STATION.get(5)));
}
public void initializeTime() {
List<Integer> time=Arrays.asList(3,2,5,1,8);
lineRepository.getLine(line.get(0)).setTime(Arrays.asList(time.get(0), time.get(0)));
lineRepository.getLine(line.get(1)).setTime(Arrays.asList(time.get(1), time.get(2),time.get(3)));
lineRepository.getLine(line.get(2)).setTime(Arrays.asList(time.get(4), time.get(0)));

}
public void initializeDistance() {
List<Integer> distance=Arrays.asList(2,3,6,10,1);
lineRepository.getLine(line.get(0)).setDistance(Arrays.asList(distance.get(0), distance.get(0)));
lineRepository.getLine(line.get(1)).setDistance(Arrays.asList(distance.get(1), distance.get(2),distance.get(4)));
lineRepository.getLine(line.get(2)).setDistance(Arrays.asList(distance.get(0), distance.get(3)));
}

}
40 changes: 40 additions & 0 deletions src/main/java/subway/Controller/PathController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package subway.Controller;

import subway.View.InputView;
import subway.View.OutputView;

import java.util.Scanner;

public class PathController {
private static final String PATH_CONTROLLER_SHORT_DISTANCE="1";
private static final String PATH_CONTROLLER_SHORT_TIME="2";
private static final String PATH_CONTROLLER_BACK="B";

OutputView outputView=new OutputView();
InputView inputView =new InputView();
ComputeShortValue computeShortValue =new ComputeShortValue();

public void startPathMenu(Scanner scanner) {
outputView.setPathMenuPathStandard();
String tmpSavePathMenuChoice = inputView.getChooseFunction(scanner);
pathMenuChoice(scanner,tmpSavePathMenuChoice);
}
public void pathMenuChoice(Scanner scanner,String tmpSavePathMenuChoice) {
if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_BACK)) {
return ;
}
if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_SHORT_TIME)) {
setPathControllerShortTime(scanner);
}
if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_SHORT_DISTANCE)) {
setPathControllerShortDistance(scanner);
}
}
public void setPathControllerShortDistance(Scanner scanner) {
computeShortValue.setDistanceGraph(inputView.getStationStart(scanner),inputView.getStationEnd(scanner));
}
public void setPathControllerShortTime(Scanner scanner) {
computeShortValue.setTimeGraph(inputView.getStationEnd(scanner),inputView.getStationStart(scanner));
}

}
26 changes: 26 additions & 0 deletions src/main/java/subway/View/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package subway.View;

import java.util.Scanner;

public class InputView {

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

public String getStationStart(Scanner scanner){
System.out.println();
System.out.println(STATION_START);
return scanner.nextLine();
}
public String getStationEnd(Scanner scanner){
System.out.println();
System.out.println(STATION_END);
return scanner.nextLine();
}
public String getChooseFunction(Scanner scanner){
System.out.println();
System.out.println(CHOOSE_FUNCTION_MAIN);
return scanner.nextLine();
}
}
34 changes: 34 additions & 0 deletions src/main/java/subway/View/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package subway.View;

import java.util.List;

public class OutputView {
private static final String MAIN_MENU_MAIN_DISPLAY="## 메인화면";
private static final String MAIN_MENU_PATH_SEARCH="1. 경로 조회";
private static final String MAIN_MENU_QUIT="Q. 종료";

private static final String PATH_MENU_PATH_STANDARD="## 경로 기준";
private static final String PATH_MENU_SHORT_DISTANCE="1. 최단거리";
private static final String PATH_MENU_SHORT_TIME="2. 최소 시간";
private static final String PATH_MENU_BACK="B. 돌아가기";

public void printStation(List<String> tmpSave) {

System.out.println("[INFO] ---");
for(String string:tmpSave) {
System.out.println("[INFO] "+string);
}
}
public void setMainMenuMainDisplay(){
System.out.println(MAIN_MENU_MAIN_DISPLAY);
System.out.println(MAIN_MENU_PATH_SEARCH);
System.out.println(MAIN_MENU_QUIT);
}
public void setPathMenuPathStandard(){
System.out.println();
System.out.println(PATH_MENU_PATH_STANDARD);
System.out.println(PATH_MENU_SHORT_DISTANCE);
System.out.println(PATH_MENU_SHORT_TIME);
System.out.println(PATH_MENU_BACK);
}
}
Loading