Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
27e310e
docs: 구현 기능 목록 작성
kmj990929 Dec 19, 2020
de030ef
feat: 메인 화면 출력 기능 구현
kmj990929 Dec 19, 2020
0ccc26a
feat: 세부 화면 출력 기능 구현
kmj990929 Dec 19, 2020
621f8fa
feat: 사용자가 원하는 기능을 입력받는 메소드 구현
kmj990929 Dec 19, 2020
3199160
feat: 입력 기호 유효성 검사 기능 구현
kmj990929 Dec 19, 2020
cbd3824
refactor: Menus와 Criterions가 MenuController의 상속을 받도록 수정
kmj990929 Dec 19, 2020
f0a27fa
refactor: MenuController -> MenuScanner 클래스명 변경
kmj990929 Dec 19, 2020
cec7e7c
refactor: Menus -> Functions 클래스명 변경
kmj990929 Dec 19, 2020
6b7eb6b
refactor: MenuScanner 클래스의 책임 일부를 Menus 클래스로 분리
kmj990929 Dec 19, 2020
1881f37
docs: 구현 기능 목록 업데이트
kmj990929 Dec 19, 2020
d698f18
feat: Quit 기능 구현
kmj990929 Dec 19, 2020
5c95e17
feat: Back 기능 구현
kmj990929 Dec 19, 2020
823255b
docs: 구현 기능 목록 업데이트
kmj990929 Dec 19, 2020
14441c9
feat: 초기 역, 노선 정보로 초기 설정
kmj990929 Dec 19, 2020
aba9690
feat: 초기 노선 정보로 역 연결 기능 구현
kmj990929 Dec 19, 2020
2edbd38
feat: 초기 구간 정보로 초기 설정
kmj990929 Dec 19, 2020
b48ffe6
feat: 출발역과 도착역 입력 기능 구현
kmj990929 Dec 19, 2020
8f07370
feat: 출발역과 도착역 유효성 검사 기능 구현
kmj990929 Dec 19, 2020
932a5b6
feat: 그래프 그리기
kmj990929 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
25 changes: 25 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 지하철 노선도 경로 조회 미션
: 두 지하철 역 사이의 최단 경로 / 최단 시간의 경로를 조회한다.

본 프로젝트는 우아한 테크코스 3기 프리코스 백엔드 과정의 2차 코딩테스트 미션을 구현한 것입니다.

## 구현 기능 목록
#### 기능 선택
- [X] 화면을 출력한다.
- [X] 사용자가 원하는 기능을 기호로 입력받는다.
- [X] 사용자가 입력한 기호가 기능목록에 존재하지 않는 경우 에러를 출력한다.
- [X] 종료(Q)를 선택하면 프로그램을 종료한다.
- [X] 돌아가기(B)를 선택하면 메인 화면으로 돌아간다.

#### 경로 조회
- [X] 초기 노선 정보로 초기화한다.
- [X] 출발역과 도착역을 입력한다.
- [X] 출발역과 도착역 입력이 유효한지 검사한다.
- [X] 출발역과 도착역이 기존에 존재하는 역인지 확인한다.
- [X] 출발역과 도착역이 서로 다른지 확인한다.
- [ ] 두 역 사이의 (기준에 따른) 경로를 계산한다.
- [ ] 두 역이 연결되어 있지 않은 경우 에러를 출력한다.
- [ ] 조회 결과를 출력한다.
- [ ] 이동 거리를 출력한다.
- [ ] 소요 시간을 출력한다.
- [ ] 경로를 출력한다.
21 changes: 20 additions & 1 deletion src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,29 @@
package subway;

import subway.controller.Initializer;
import subway.controller.MenuScanner;
import subway.controller.Navigator;
import subway.domain.Menus;
import subway.view.InputView;

import java.util.Scanner;

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

private static void run(InputView inputView) {
Navigator navigator = Initializer.set();
MenuScanner menuScanner = new MenuScanner();
String selectedMenus = menuScanner.scanMenus(inputView);
boolean quit = Menus.isQuit(selectedMenus);
while (!quit) {
Menus.run(inputView, selectedMenus, navigator);
selectedMenus = menuScanner.scanMenus(inputView);
quit = Menus.isQuit(selectedMenus);
}
}
}
110 changes: 110 additions & 0 deletions src/main/java/subway/controller/Initializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package subway.controller;

import subway.controller.Navigator;
import subway.domain.Edge;
import subway.domain.Station;
import subway.domain.StationRepository;
import subway.domain.Line;
import subway.domain.LineRepository;

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

public class Initializer {
private static final int NEXT_CONSTANT = 1;
private static final int ORDER_CONSTANT = 1;

private static final String station1 = "교대역";
private static final String station2 = "강남역";
private static final String station3 = "역삼역";
private static final String station4 = "남부터미널역";
private static final String station5 = "양재역";
private static final String station6 = "양재시민의숲역";
private static final String station7 = "매봉역";

private static final String line1 = "2호선";
private static final String line2 = "3호선";
private static final String line3 = "신분당선";

private static final List<String> initStations = Arrays
.asList(station1, station2, station3, station4, station5, station6, station7);
private static final List<String> line1Stations = Arrays.asList(station1, station2, station3);
private static final List<String> line2Stations = Arrays.asList(station1, station4, station5, station7);
private static final List<String> line3Stations = Arrays.asList(station2, station5, station6);

private static final HashMap<String, List<String>> initLines = new HashMap<String, List<String>>() {{
put(line1, line1Stations);
put(line2, line2Stations);
put(line3, line3Stations);
}};

private Initializer() {
}

public static Navigator set() {
Navigator navigator = new Navigator();
HashMap<String,Station> stations = makeStations(navigator);
List<String> lineNameList = new ArrayList<String>(initLines.keySet());
for (int i = 0; i < lineNameList.size(); i++) {
String lineName = lineNameList.get(i);
makeLine(lineName, navigator);
}
return navigator;
}

private static HashMap<String, Station> makeStations(Navigator navigator) {
HashMap<String, Station> stations = new HashMap<String, Station>();
for (int i = 0; i < initStations.size(); i++) {
String stationName = initStations.get(i);
Station station = new Station(stationName);
StationRepository.addStation(station);
stations.put(stationName, station);
navigator.addStation(stationName);
}
return stations;
}

private static void makeLine(String lineName, Navigator navigator) {
Line line = new Line(lineName);
List<String> stationList = initLines.get(lineName);
for (int i = 0; i < stationList.size(); i++) {
String stationName = stationList.get(i);
int order = i + ORDER_CONSTANT;
line.addStationByName(stationName, order);
makeEdgeInLine(line, navigator);
}
LineRepository.addLine(line);
}

private static void makeEdgeInLine(Line line, Navigator navigator) {
List<Edge> edgeList = makeEdge(line);
List<String> stationNameList = line.getStationNameList();
for (int i = 0; i < edgeList.size(); i++) {
Edge edge = edgeList.get(i);
//line.addEdge(edge,i);
//navigator.addEdge(stationNameList.get(i), stationNameList.get(i+NEXT_CONSTANT),edge);
}
}

//자료형 사용해보자, 수정 필요
private static List<Edge> makeEdge(Line line) {
String lineName = line.getName();
List<Edge> edgeList = new ArrayList<Edge>();
if (lineName.equals(line1)) {
edgeList.add(new Edge(2,3));
edgeList.add(new Edge(2,3));
}
if (lineName.equals(line2)) {
edgeList.add(new Edge(3,2));
edgeList.add(new Edge(6,5));
edgeList.add(new Edge(1,1));
}
if (lineName.equals(line3)) {
edgeList.add(new Edge(2,8));
edgeList.add(new Edge(10,3));
}
return edgeList;
}
}
44 changes: 44 additions & 0 deletions src/main/java/subway/controller/MenuScanner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package subway.controller;

import subway.domain.Criterions;
import subway.domain.Functions;
import subway.domain.Menus;
import subway.view.InputView;
import subway.view.OutputView;

public class MenuScanner {

private static final Functions functions = new Functions();
private static final Criterions criterions = new Criterions();

public MenuScanner() {
}

public String scanMenus(InputView inputView) {
String selectedFunction = scanFunctions(inputView);
boolean quit = Menus.isQuit(selectedFunction);
if (quit) {
return selectedFunction;
}
String selectedCriterion = scanCriterions(inputView);
return selectedCriterion;
}

public String scanFunctions(InputView inputView) {
OutputView.printMainScreen();
String selectedFunction;
do {
selectedFunction = inputView.scanMenu();
} while(!functions.isValid(selectedFunction));
return selectedFunction;
}

public String scanCriterions(InputView inputView) {
OutputView.printSubScreen();
String selectedCriterion;
do {
selectedCriterion = inputView.scanMenu();
} while(!criterions.isValid(selectedCriterion));
return selectedCriterion;
}
}
36 changes: 36 additions & 0 deletions src/main/java/subway/controller/Navigator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package subway.controller;

import subway.domain.Edge;

import java.util.List;
import org.jgrapht.graph.WeightedMultigraph;
import org.jgrapht.graph.DefaultWeightedEdge;

public class Navigator {

public WeightedMultigraph<String, DefaultWeightedEdge> distanceGraph;
public WeightedMultigraph<String, DefaultWeightedEdge> timeGraph;

public Navigator() {
this.distanceGraph = new WeightedMultigraph(DefaultWeightedEdge.class);
this.timeGraph = new WeightedMultigraph(DefaultWeightedEdge.class);
}

public void addStation(String stationName) {
distanceGraph.addVertex(stationName);
timeGraph.addVertex(stationName);
}

public void addEdge(String startStation, String endStation, Edge edge) {
distanceGraph.setEdgeWeight(distanceGraph.addEdge(startStation, endStation), edge.distance);
timeGraph.setEdgeWeight(timeGraph.addEdge(startStation, endStation), edge.time);
}

public List<String> searchShortestDistance(List<String> stations) {
return stations;
}

public List<String> searchShortestTime(List<String> stations) {
return stations;
}
}
42 changes: 42 additions & 0 deletions src/main/java/subway/domain/Criterions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package subway.domain;

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

public class Criterions extends Menus {

private static final String distanceSign = "1";
private static final String timeSign = "2";
private static final String backSign = "B";
private static final List<String> signs = Arrays
.asList(new String[]{distanceSign, timeSign, backSign});

public Criterions() {
}

@Override
public List<String> getSigns() {
return signs;
}

public static boolean isBack(String sign) {
if (sign.equals(backSign)) {
return true;
}
return false;
}

public boolean isDistanceSign(String sign) {
if (sign.equals(distanceSign)) {
return true;
}
return false;
}

public boolean isTimeSign(String sign) {
if (sign.equals(timeSign)) {
return true;
}
return false;
}
}
14 changes: 14 additions & 0 deletions src/main/java/subway/domain/Edge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package subway.domain;

public class Edge {

public int distance;
public int time;
public final String distanceUnit = "km";
public final String timeUnit = "분";

public Edge(int distance, int time) {
this.distance = distance;
this.time = time;
}
}
27 changes: 27 additions & 0 deletions src/main/java/subway/domain/Functions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package subway.domain;

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

public class Functions extends Menus {

private static final String searchSign = "1";
private static final String quitSign = "Q";
private static List<String> signs = Arrays
.asList(new String[]{searchSign, quitSign});

public Functions() {
}

@Override
public List<String> getSigns() {
return signs;
}

public static boolean isQuit(String menu) {
if (menu.equals(quitSign)) {
return true;
}
return false;
}
}
33 changes: 32 additions & 1 deletion src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package subway.domain;

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

public class Line {
private static final int ORDER_CONSTANT = 1;

private String name;
private List<Station> stations = new ArrayList<>();
private List<Edge> edges = new ArrayList<>();

public Line(String name) {
this.name = name;
Expand All @@ -11,5 +18,29 @@ public String getName() {
return name;
}

// 추가 기능 구현
private void addStation(Station station, int order) {
int indexOrder = order - ORDER_CONSTANT;
stations.add(indexOrder,station);
}

public void addEdge(Edge edge, int order) {
edges.add(order,edge);
}

public void addStationByName(String stationName, int order) {
for (int i = 0; i < StationRepository.stations().size(); i++) {
Station station = StationRepository.stations().get(i);
if (station.getName().equals(stationName)) {
addStation(station, order);
}
}
}

public List<String> getStationNameList() {
List<String> stationList = new ArrayList<String>();
for (int i = 0; i < stations.size(); i++) {
stationList.add(stations.get(i).getName());
}
return stationList;
}
}
Loading