From 8de940e62f9567c9679b607394832f7589076a22 Mon Sep 17 00:00:00 2001 From: Gomding <57378410+Gomding@users.noreply.github.com> Date: Sat, 19 Dec 2020 13:21:49 +0900 Subject: [PATCH 01/21] =?UTF-8?q?docs=20:=20=EA=B5=AC=ED=98=84=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 268 ++++-------------------------------------------------- 1 file changed, 18 insertions(+), 250 deletions(-) diff --git a/README.md b/README.md index d6299154c..cbf238899 100644 --- a/README.md +++ b/README.md @@ -1,253 +1,21 @@ # 지하철 노선도 경로 조회 미션 - 등록된 지하철 노선도에서 경로를 조회하는 기능을 구현한다. -
- -## 🚀 기능 요구사항 - -> 프리코스 3주차 미션에서 사용한 코드를 참고해도 무관하다. - -### 초기 설정 -- 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정 해야 한다. -- 거리와 소요 시간은 양의 정수이며 단위는 km와 분을 의미한다. -- 아래의 사전 등록 정보로 반드시 초기 설정을 한다. - -``` - 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. - 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. - 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) - - 2호선: 교대역 - ( 2km / 3분 ) - 강남역 - ( 2km / 3분 ) - 역삼역 - - 3호선: 교대역 - ( 3km / 2분 ) - 남부터미널역 - ( 6km / 5분 ) - 양재역 - ( 1km / 1분 ) - 매봉역 - - 신분당선: 강남역 - ( 2km / 8분 ) - 양재역 - ( 10km / 3분 ) - 양재시민의숲역 - ``` - -### 경로 조회 기능 -- 출발역과 도착역을 입력받아 경로를 조회한다. -- 경로 조회 시 총 거리, 총 소요 시간도 함께 출력한다. -- 경로 조회 기준은 `최단 거리` `최소 시간`이 있다. - -### 예외 처리 -- 경로 조회 시 출발역과 도착역이 같으면 에러를 출력한다. -- 경로 조회 시 출발역과 도착역이 연결되어 있지 않으면 에러를 출력한다. -- 그 외 정상적으로 프로그램이 수행되지 않은 경우 에러를 출력한다. - -
- -## ✍🏻 입출력 요구사항 -- `프로그래밍 실행 결과 예시`와 동일하게 입출력을 구현한다. -- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다. -- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. 에러의 문구는 자유롭게 작성한다. - -### 💻 프로그래밍 실행 결과 예시 -#### 경로 조회 -``` -## 메인 화면 -1. 경로 조회 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 출발역을 입력하세요. -교대역 - -## 도착역을 입력하세요. -양재역 - -## 조회 결과 -[INFO] --- -[INFO] 총 거리: 6km -[INFO] 총 소요 시간: 14분 -[INFO] --- -[INFO] 교대역 -[INFO] 강남역 -[INFO] 양재역 - -## 메인 화면 -1. 경로 조회 -Q. 종료 - -... -``` - -#### 에러 출력 예시 - -``` -## 메인 화면 -1. 경로 조회 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 출발역을 입력하세요. -강남역 - -## 도착역을 입력하세요. -강남역 - -[ERROR] 출발역과 도착역이 동일합니다. - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 - -## 원하는 기능을 선택하세요. - -... - -``` - -
- -## 🎱 프로그래밍 요구사항 -- 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다. - - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다. -- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다. - -### 프로그래밍 요구사항 - Application -- Application 클래스를 활용해 구현해야 한다. -- Application의 패키지 구조는 변경하지 않는다. -- Application 클래스에 있는 Scanner를 사용하고 별도의 Scanner 객체를 만들지 않는다. -```java -public class Application { - public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - ... - } -} -``` - -### 프로그래밍 요구사항 - Station, Line -- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다. -- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다. -- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다. -- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다. - -```java -public class Station { - private String name; - - public Station(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - // 추가 기능 구현 -} - -``` - -### 프로그래밍 요구사항 - StationRepository, LineRepository -- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다. -- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다. -- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가한다. -- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다. -- 작성된 메서드는 수정할 수 없고, 필요에 따라 메서드를 자유롭게 추가할 수 있다. - -```java -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } - - public static void deleteAll() { - stations.clear(); - } -} -``` - -
- -## ❗️힌트 -### 최단 경로 라이브러리 -- jgrapht 라이브러리를 활용하면 간편하게 최단거리를 조회할 수 있음 -- Dijkstra 알고리즘을 반드시 이해할 필요는 없고 미션에 적용할 정도로만 이해하면 됨 -- JGraphtTest 클래스의 테스트를 활용하여 미션에 필요한 라이브러리의 기능을 학습할 수 있음 -- 정점(vertex)과 간선(edge), 그리고 가중치 개념을 이용 - - 정점: 지하철역 - - 간선: 지하철역 연결정보 - - 가중치: 거리 or 소요 시간 -- 최단 거리 기준 조회 시 가중치를 거리로 설정 - -```java -@Test -public void getDijkstraShortestPath() { - WeightedMultigraph graph - = new WeightedMultigraph(DefaultWeightedEdge.class); - graph.addVertex("v1"); - graph.addVertex("v2"); - graph.addVertex("v3"); - graph.setEdgeWeight(graph.addEdge("v1", "v2"), 2); - graph.setEdgeWeight(graph.addEdge("v2", "v3"), 2); - graph.setEdgeWeight(graph.addEdge("v1", "v3"), 100); - - DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph); - List shortestPath = dijkstraShortestPath.getPath("v3", "v1").getVertexList(); - - assertThat(shortestPath.size()).isEqualTo(3); -} -``` - -#### 테스트 설명 - - - -- 역 사이의 거리를 고려하지 않는 경우 V1->V3 경로가 최단 경로 -- 역 사이의 거리를 고려할 경우 V1->V3 경로의 거리는 100km, V1->V2->V3 경로의 거리는 4km이므로 최단 경로는 V1->V2->V3 - -
- -## 📈 진행 요구사항 -- 미션은 [java-subway-path-precourse 저장소](https://github.com/woowacourse/java-subway-path-precourse) 를 fork/clone해 시작한다. -- 기능을 구현하기 전에 java-subway-path-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다. -- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다. - - [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다. -
- -## 📝 License - -This project is [MIT](https://github.com/woowacourse/java-subway-path-precourse/blob/master/LICENSE.md) licensed. +## 초기 설정 + - 프로그램 시작 시 역, 노선, 구간 정보를 설정 + - 거리와 소요 시간은 양의 정수(단위는 km와 분) + - 2호선: 교대역 - ( 2km / 3분 ) - 강남역 - ( 2km / 3분 ) - 역삼역 + - 3호선: 교대역 - ( 3km / 2분 ) - 남부터미널역 - ( 6km / 5분 ) - 양재역 - ( 1km / 1분 ) - 매봉역 + - 신분당선: 강남역 - ( 2km / 8분 ) - 양재역 - ( 10km / 3분 ) - 양재시민의숲역 + +## 경로 조회 기능 + - 출발역과 도착역을 입력받아 경로를 조회한다. + - 경로 조회 시 총 거리, 총 소요 시간도 함께 출력한다. + - 경로 조회 기준은 '최단 거리' '최소 시간' + +## 구현기능 목록 + - 초기 설정값 세팅하는 기능 추가 + - 출발역과 도착역을 입력받는 기능을 추가 + - 경로를 어느 기준으로 선택할지 보는 화면 추가 + - 최단 거리를 기준으로 조회하는 기능 추가 + - 최소 시간 기준으로 조회하는 기능 추가 From edc9a80ac3b61fbda76efbb15813594bc9062ef4 Mon Sep 17 00:00:00 2001 From: Gomding <57378410+Gomding@users.noreply.github.com> Date: Sat, 19 Dec 2020 13:24:42 +0900 Subject: [PATCH 02/21] =?UTF-8?q?update(README)=20:=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cbf238899..7670af0f4 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ - 경로 조회 기준은 '최단 거리' '최소 시간' ## 구현기능 목록 + - 구간의 정보(역과 역을 연결하고 거리와 시간정보)을 가지는 Section 클래스 추가 + - 구간의 정보를 저장하는 Repository 추가 - 초기 설정값 세팅하는 기능 추가 - 출발역과 도착역을 입력받는 기능을 추가 - 경로를 어느 기준으로 선택할지 보는 화면 추가 From 8bdba9e9d48b847974abee65977a2d85e56706a5 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:06:17 +0900 Subject: [PATCH 03/21] =?UTF-8?q?feat=20:=20=EA=B5=AC=EA=B0=84=EC=9D=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4(=EC=97=B0=EA=B2=B0=EB=90=9C=20=EC=97=AD,=20?= =?UTF-8?q?=EA=B1=B0=EB=A6=AC,=20=EA=B1=B8=EB=A6=AC=EB=8A=94=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84)=EC=9D=84=20=EA=B0=80=EC=A7=80=EB=8A=94=20Section=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Section.java | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/subway/domain/Section.java diff --git a/src/main/java/subway/domain/Section.java b/src/main/java/subway/domain/Section.java new file mode 100644 index 000000000..51c65cd01 --- /dev/null +++ b/src/main/java/subway/domain/Section.java @@ -0,0 +1,25 @@ +package subway.domain; + +public class Section { + private String linkedStationName; + private int distance; + private int time; + + public Section(String linkedStationName, int distance, int time) { + this.linkedStationName = linkedStationName; + this.distance = distance; + this.time = time; + } + + public String getLinkedStationName() { + return linkedStationName; + } + + public int getDistance() { + return distance; + } + + public int getTime() { + return time; + } +} From 30e00cf3c4e761b982a1d1f6844b16ffd66f29be Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:09:58 +0900 Subject: [PATCH 04/21] =?UTF-8?q?feat=20:=20=EA=B5=AC=EA=B0=84=EB=93=A4?= =?UTF-8?q?=EC=9D=84=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20SectionRepos?= =?UTF-8?q?itory=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/SectionRepository.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/subway/domain/SectionRepository.java diff --git a/src/main/java/subway/domain/SectionRepository.java b/src/main/java/subway/domain/SectionRepository.java new file mode 100644 index 000000000..bd75daa5b --- /dev/null +++ b/src/main/java/subway/domain/SectionRepository.java @@ -0,0 +1,26 @@ +package subway.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class SectionRepository { + private static final List
sections = new ArrayList<>(); + + public static List
sections() { + return Collections.unmodifiableList(sections); + } + + public static void addSection(Section section) { + sections.add(section); + } + + public static boolean deleteSectionByName(String name) { + return sections.removeIf(line -> Objects.equals(line.getLinkedStationName(), name)); + } + + public static void deleteAll() { + sections.clear(); + } +} From bc7d8f317d64150ab5406479d1edb658b4a46caa Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:11:01 +0900 Subject: [PATCH 05/21] =?UTF-8?q?feat=20:=20=EB=85=B8=EC=84=A0=20=EC=95=88?= =?UTF-8?q?=EC=97=90=20=EA=B5=AC=EA=B0=84=EC=9D=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..7938b9d82 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,5 +1,10 @@ package subway.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + public class Line { private String name; @@ -12,4 +17,18 @@ public String getName() { } // 추가 기능 구현 + + private List stationList = new ArrayList<>(); + + public List stations() { + return Collections.unmodifiableList(stationList); + } + + public void addStation(Station station) { + stationList.add(station); + } + + public boolean deleteStation(String name) { + return stationList.removeIf(station -> Objects.equals(station.getName(), name)); + } } From baea13dbe8a9cd83a7611433113e2672b2a1946d Mon Sep 17 00:00:00 2001 From: Gomding <57378410+Gomding@users.noreply.github.com> Date: Sat, 19 Dec 2020 14:11:53 +0900 Subject: [PATCH 06/21] =?UTF-8?q?update(README)=20:=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7670af0f4..ee5b2806b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ ## 구현기능 목록 - 구간의 정보(역과 역을 연결하고 거리와 시간정보)을 가지는 Section 클래스 추가 - 구간의 정보를 저장하는 Repository 추가 + - 노선 안에 구간을 추가하는 기능 추가 + - 역 안에 구간의 정보(Section)를 담는 기능 추가 - 초기 설정값 세팅하는 기능 추가 - 출발역과 도착역을 입력받는 기능을 추가 - 경로를 어느 기준으로 선택할지 보는 화면 추가 From 7ceca71b95a24f23d503873115e7a4daaa1657a6 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:13:22 +0900 Subject: [PATCH 07/21] =?UTF-8?q?feat=20:=20Station=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=95=88=EC=97=90=EC=84=9C=20=EC=96=B4=EB=96=A4=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=EC=97=90=20=ED=8F=AC=ED=95=A8=EB=90=9C=20?= =?UTF-8?q?=EC=97=AD=EC=9D=B8=EC=A7=80=20=EC=95=8C=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 포함된 노선들을 의미하는 lineList 추가함 --- src/main/java/subway/domain/Station.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..11c26299c 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -1,5 +1,8 @@ package subway.domain; +import java.util.ArrayList; +import java.util.List; + public class Station { private String name; @@ -12,4 +15,13 @@ public String getName() { } // 추가 기능 구현 + private List lineList = new ArrayList<>(); + + public void addLine(String lineName) { + lineList.add(lineName); + } + + public boolean includedLine(String lineName) { + return lineList.contains(lineName); + } } From 3e506965f1b643e2051a7984195137022731dc8c Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:41:06 +0900 Subject: [PATCH 08/21] =?UTF-8?q?feat=20:=20=EB=85=B8=EC=84=A0=EA=B3=BC=20?= =?UTF-8?q?=EC=97=AD=EC=9D=98=20=EA=B8=B0=EC=B4=88=EA=B0=92=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/LineRepository.java | 3 --- src/main/java/subway/domain/Station.java | 6 +++++ src/main/java/subway/util/DefaultSetting.java | 24 +++++++++++++++++++ .../java/subway/util/enums/DefaultLines.java | 17 +++++++++++++ .../subway/util/enums/DefaultStations.java | 21 ++++++++++++++++ 5 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/main/java/subway/util/DefaultSetting.java create mode 100644 src/main/java/subway/util/enums/DefaultLines.java create mode 100644 src/main/java/subway/util/enums/DefaultStations.java diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 2c4a723c9..65551ac22 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -20,7 +20,4 @@ public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } - public static void deleteAll() { - lines.clear(); - } } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index 11c26299c..db080392d 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -24,4 +24,10 @@ public void addLine(String lineName) { public boolean includedLine(String lineName) { return lineList.contains(lineName); } + + private List
sectionList = new ArrayList<>(); + + public void addSection(String linkedStationName, int distance, int time) { + sectionList.add(new Section(linkedStationName, distance, time)); + } } diff --git a/src/main/java/subway/util/DefaultSetting.java b/src/main/java/subway/util/DefaultSetting.java new file mode 100644 index 000000000..7fa57689a --- /dev/null +++ b/src/main/java/subway/util/DefaultSetting.java @@ -0,0 +1,24 @@ +package subway.util; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.util.enums.DefaultLines; +import subway.util.enums.DefaultStations; + +public class DefaultSetting { + + public static void defaultSetting() { + for (DefaultStations ds : DefaultStations.values()) { + StationRepository.addStation(new Station(ds.getName())); + } + + for (DefaultLines dl : DefaultLines.values()) { + LineRepository.addLine(new Line(dl.getName())); + } + + + + } +} diff --git a/src/main/java/subway/util/enums/DefaultLines.java b/src/main/java/subway/util/enums/DefaultLines.java new file mode 100644 index 000000000..e1bf14376 --- /dev/null +++ b/src/main/java/subway/util/enums/DefaultLines.java @@ -0,0 +1,17 @@ +package subway.util.enums; + +public enum DefaultLines { + LINE2("2호선"), + LINE3("3호선"), + SINBUNDANG_LINE("신분당선"); + + private String name; + + private DefaultLines(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/subway/util/enums/DefaultStations.java b/src/main/java/subway/util/enums/DefaultStations.java new file mode 100644 index 000000000..e5eedc533 --- /dev/null +++ b/src/main/java/subway/util/enums/DefaultStations.java @@ -0,0 +1,21 @@ +package subway.util.enums; + +public enum DefaultStations { + KYODAE("교대역"), + GANGNAM("강남역"), + YEOKSAM("역삼역"), + NORTH_TERMINAL("남부터미널역"), + YANGJAE("양재역"), + YANGJAE_CITIZEN_FOREST("양재시민의숲역"), + MAEBONG("매봉역"); + + private String name; + + DefaultStations(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} From 59318e7a7df4297626df8ef971b5c54e8cb3a4a2 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:42:02 +0900 Subject: [PATCH 09/21] =?UTF-8?q?feat=20:=20=EC=97=AD=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9C=BC=EB=A1=9C=20StationRepository=EB=A5=BC=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/SectionRepository.java | 2 +- src/main/java/subway/domain/StationRepository.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/SectionRepository.java b/src/main/java/subway/domain/SectionRepository.java index bd75daa5b..b7493856c 100644 --- a/src/main/java/subway/domain/SectionRepository.java +++ b/src/main/java/subway/domain/SectionRepository.java @@ -12,7 +12,7 @@ public static List
sections() { return Collections.unmodifiableList(sections); } - public static void addSection(Section section) { + public static void addSetion(Section section) { sections.add(section); } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 8ed9d103f..27e400a28 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -23,4 +23,13 @@ public static boolean deleteStation(String name) { public static void deleteAll() { stations.clear(); } + + public static Station findStationByName(String name) { + for (Station station : stations()) { + if (station.getName().equals(name)) { + return station; + } + } + return null; + } } From 7811e0f4340bb27725e52f2912bb9ad2d4bffcfe Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 14:42:39 +0900 Subject: [PATCH 10/21] =?UTF-8?q?feat=20:=20=EB=85=B8=EC=84=A0=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9C=BC=EB=A1=9C=20LineRepository=EB=A5=BC?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/LineRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 65551ac22..c3f66e140 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -20,4 +20,12 @@ public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + public static Line findLineByName(String lineName) { + for (Line line : lines) { + if (line.getName().equals(lineName)) { + return line; + } + } + return null; + } } From 78b5765c3a99e569a1fb5fef5461779772368b9c Mon Sep 17 00:00:00 2001 From: Gomding <57378410+Gomding@users.noreply.github.com> Date: Sat, 19 Dec 2020 14:58:02 +0900 Subject: [PATCH 11/21] =?UTF-8?q?update(README)=20:=20=EA=B3=A0=EB=A0=A4?= =?UTF-8?q?=ED=95=B4=EC=95=BC=ED=95=A0=20=EC=82=AC=ED=95=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index ee5b2806b..97e52eaf8 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,9 @@ - 경로를 어느 기준으로 선택할지 보는 화면 추가 - 최단 거리를 기준으로 조회하는 기능 추가 - 최소 시간 기준으로 조회하는 기능 추가 + + +## 고려할 사항 + - 이동은 양측방향이 다 가능함 + - 환승은 허용됨 + - 역이 이어져 있는지 어떻게 증명할것인가 From b1781c526e02b267c72fd923abdc0b6eaaecab03 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 15:39:48 +0900 Subject: [PATCH 12/21] =?UTF-8?q?feat=20:=20=EA=B5=AC=EA=B0=84=EB=B3=84=20?= =?UTF-8?q?=EA=B1=B0=EB=A6=AC=20=EB=B0=8F=20=EC=8B=9C=EA=B0=84=EC=9D=98=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=EA=B0=92=EC=9D=84=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 6 ++- src/main/java/subway/domain/Station.java | 8 +++- src/main/java/subway/util/DefaultSetting.java | 36 ++++++++++++++ src/test/java/subway/DefaultSettingTest.java | 48 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 src/test/java/subway/DefaultSettingTest.java diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 7938b9d82..feeccfeaf 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -24,11 +24,13 @@ public List stations() { return Collections.unmodifiableList(stationList); } - public void addStation(Station station) { + public void addStation(String stationName) { + Station station = StationRepository.findStationByName(stationName); + station.addLine(this.name); stationList.add(station); } public boolean deleteStation(String name) { - return stationList.removeIf(station -> Objects.equals(station.getName(), name)); + return stationList.removeIf(station -> station.getName().equals(name)); } } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index db080392d..0cf5dbd80 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -1,6 +1,7 @@ package subway.domain; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Station { @@ -27,7 +28,12 @@ public boolean includedLine(String lineName) { private List
sectionList = new ArrayList<>(); - public void addSection(String linkedStationName, int distance, int time) { + public Station addSection(String linkedStationName, int distance, int time) { sectionList.add(new Section(linkedStationName, distance, time)); + return this; + } + + public List
sections() { + return Collections.unmodifiableList(sectionList); } } diff --git a/src/main/java/subway/util/DefaultSetting.java b/src/main/java/subway/util/DefaultSetting.java index 7fa57689a..d686f2703 100644 --- a/src/main/java/subway/util/DefaultSetting.java +++ b/src/main/java/subway/util/DefaultSetting.java @@ -18,7 +18,43 @@ public static void defaultSetting() { LineRepository.addLine(new Line(dl.getName())); } + Line line2 = LineRepository.findLineByName(DefaultLines.LINE2.getName()); + line2.addStation(DefaultStations.KYODAE.getName()); + line2.addStation(DefaultStations.GANGNAM.getName()); + line2.addStation(DefaultStations.YEOKSAM.getName()); + Line line3 = LineRepository.findLineByName(DefaultLines.LINE3.getName()); + line3.addStation(DefaultStations.KYODAE.getName()); + line3.addStation(DefaultStations.NORTH_TERMINAL.getName()); + line3.addStation(DefaultStations.YANGJAE.getName()); + line3.addStation(DefaultStations.MAEBONG.getName()); + Line sinBunDang = LineRepository.findLineByName(DefaultLines.SINBUNDANG_LINE.getName()); + sinBunDang.addStation(DefaultStations.GANGNAM.getName()); + sinBunDang.addStation(DefaultStations.YANGJAE.getName()); + sinBunDang.addStation(DefaultStations.YANGJAE_CITIZEN_FOREST.getName()); + + StationRepository.findStationByName(DefaultStations.KYODAE.getName()) + .addSection(DefaultStations.GANGNAM.getName(), 2, 3) + .addSection(DefaultStations.NORTH_TERMINAL.getName(), 3, 2); + StationRepository.findStationByName(DefaultStations.GANGNAM.getName()) + .addSection(DefaultStations.KYODAE.getName(), 2, 3) + .addSection(DefaultStations.YEOKSAM.getName(), 2, 3) + .addSection(DefaultStations.YANGJAE.getName(), 2, 8); + StationRepository.findStationByName(DefaultStations.YEOKSAM.getName()) + .addSection(DefaultStations.GANGNAM.getName(), 2, 3); + + StationRepository.findStationByName(DefaultStations.NORTH_TERMINAL.getName()) + .addSection(DefaultStations.KYODAE.getName(), 3, 2) + .addSection(DefaultStations.YANGJAE.getName(), 6, 5); + StationRepository.findStationByName(DefaultStations.YANGJAE.getName()) + .addSection(DefaultStations.NORTH_TERMINAL.getName(), 6, 5) + .addSection(DefaultStations.MAEBONG.getName(), 1, 1) + .addSection(DefaultStations.GANGNAM.getName(), 2, 8) + .addSection(DefaultStations.YANGJAE_CITIZEN_FOREST.getName(), 10, 3); + StationRepository.findStationByName(DefaultStations.MAEBONG.getName()) + .addSection(DefaultStations.YANGJAE.getName(), 1, 1); + StationRepository.findStationByName(DefaultStations.YANGJAE_CITIZEN_FOREST.getName()) + .addSection(DefaultStations.YANGJAE.getName(), 10, 3); } } diff --git a/src/test/java/subway/DefaultSettingTest.java b/src/test/java/subway/DefaultSettingTest.java new file mode 100644 index 000000000..73a6beacd --- /dev/null +++ b/src/test/java/subway/DefaultSettingTest.java @@ -0,0 +1,48 @@ +package subway; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.util.DefaultSetting; +import subway.util.enums.DefaultLines; +import subway.util.enums.DefaultStations; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class DefaultSettingTest { + + @BeforeAll + public static void 초기값_세팅() { + DefaultSetting.defaultSetting(); + } + + @Test + public void 이호선_만들어졌다() { + Line line2 = LineRepository.findLineByName(DefaultLines.LINE2.getName()); + assertEquals(line2.getName(), DefaultLines.LINE2.getName()); + } + + @Test + public void 노선들_만들어졌다() { + List lineList= LineRepository.lines(); + assertEquals(lineList.size(), 3); + } + + @Test + public void 역들_만들어졌다() { + List stationList = StationRepository.stations(); + assertEquals(stationList.size(), 7); + } + + @Test + public void 구간_적용됐다() { + Station station = StationRepository.findStationByName(DefaultStations.KYODAE.getName()); + assertEquals(station.sections().size(), 2); + } + +} From 17619eaeba3bd7481dc61fafc2893975e8105ba8 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 15:40:47 +0900 Subject: [PATCH 13/21] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=9D=B8=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20view=EB=A5=BC=20=EB=8B=B4=EB=8B=B9=ED=95=98?= =?UTF-8?q?=EB=8A=94=20MainMenu=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/Application.java | 4 ++++ src/main/java/subway/view/MainMenu.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/subway/view/MainMenu.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..489f8eac5 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,14 @@ package subway; +import subway.view.MainMenu; + import java.util.Scanner; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); // TODO: 프로그램 구현 + + new MainMenu(scanner).startMainMENU(); } } diff --git a/src/main/java/subway/view/MainMenu.java b/src/main/java/subway/view/MainMenu.java new file mode 100644 index 000000000..7525fda3c --- /dev/null +++ b/src/main/java/subway/view/MainMenu.java @@ -0,0 +1,19 @@ +package subway.view; + +import java.util.Scanner; + +public class MainMenu { + private final String MAIN_TITLE = "## 메인 화면"; + private final String MAINMENU_1 = "1. 경로 조회"; + private final String QUIT_APP = "Q. 종료"; + + private Scanner scanner; + + public MainMenu(Scanner scanner) { + this.scanner = scanner; + } + + public void startMainMENU() { + + } +} From fd4e7224a61e036b9cfc508d999545531f7e6030 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 15:48:47 +0900 Subject: [PATCH 14/21] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=9D=B8=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=ED=99=94=EB=A9=B4=EC=9D=84=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EA=B3=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EC=9D=98=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/MainMenu.java | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/subway/view/MainMenu.java b/src/main/java/subway/view/MainMenu.java index 7525fda3c..fee414f92 100644 --- a/src/main/java/subway/view/MainMenu.java +++ b/src/main/java/subway/view/MainMenu.java @@ -6,6 +6,9 @@ public class MainMenu { private final String MAIN_TITLE = "## 메인 화면"; private final String MAINMENU_1 = "1. 경로 조회"; private final String QUIT_APP = "Q. 종료"; + private final String ENTER = "\n"; + private final String CHOICE_MENU = "## 원하는 기능을 선택하세요."; + private final String QUIT_MESSAGE = "프로그램을 종료합니다."; private Scanner scanner; @@ -14,6 +17,31 @@ public MainMenu(Scanner scanner) { } public void startMainMENU() { + outputMainMenu(); + String input = scanner.nextLine(); + System.out.println(); + inputMenu(input); + } + + private void outputMainMenu() { + StringBuilder sb = new StringBuilder(); + sb.append(MAIN_TITLE).append(ENTER) + .append(MAINMENU_1).append(ENTER) + .append(QUIT_APP).append(ENTER) + .append(ENTER) + .append(CHOICE_MENU); + } + + private void inputMenu(String input) { + while (true) { + if (input.equals("1")) { + } + if (input.equals("Q")) { + System.out.println(); + System.out.println(QUIT_MESSAGE); + return; + } + } } } From 0bdfddf57f7b4f919a536fb05787063a594699dc Mon Sep 17 00:00:00 2001 From: Gomding <57378410+Gomding@users.noreply.github.com> Date: Sat, 19 Dec 2020 15:50:00 +0900 Subject: [PATCH 15/21] =?UTF-8?q?update(README)=20:=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 97e52eaf8..d50ab8feb 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ - 노선 안에 구간을 추가하는 기능 추가 - 역 안에 구간의 정보(Section)를 담는 기능 추가 - 초기 설정값 세팅하는 기능 추가 + - 메인메뉴 view 화면 추가 + - 경로 조회 메뉴 view 화면 추가 - 출발역과 도착역을 입력받는 기능을 추가 - 경로를 어느 기준으로 선택할지 보는 화면 추가 - 최단 거리를 기준으로 조회하는 기능 추가 From 176f770a431a1a4eb82c1df0a5ebb143073dded0 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 16:15:40 +0900 Subject: [PATCH 16/21] =?UTF-8?q?feat=20:=20=EA=B2=BD=EB=A1=9C=20=ED=83=90?= =?UTF-8?q?=EC=83=89=20=EB=A9=94=EB=89=B4=20RouteSearchMenu=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=9D=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9D=84=20=EB=B0=9B=EC=95=84=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EB=A5=BC=20=EC=84=A0=ED=83=9D=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/MainMenu.java | 3 +- .../java/subway/view/RouteSearchMenu.java | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/view/RouteSearchMenu.java diff --git a/src/main/java/subway/view/MainMenu.java b/src/main/java/subway/view/MainMenu.java index fee414f92..7d02de441 100644 --- a/src/main/java/subway/view/MainMenu.java +++ b/src/main/java/subway/view/MainMenu.java @@ -30,12 +30,13 @@ private void outputMainMenu() { .append(QUIT_APP).append(ENTER) .append(ENTER) .append(CHOICE_MENU); + System.out.println(sb); } private void inputMenu(String input) { while (true) { if (input.equals("1")) { - + new RouteSearchMenu(scanner).startRouteSearchMenu(); } if (input.equals("Q")) { System.out.println(); diff --git a/src/main/java/subway/view/RouteSearchMenu.java b/src/main/java/subway/view/RouteSearchMenu.java new file mode 100644 index 000000000..cd0c9b72b --- /dev/null +++ b/src/main/java/subway/view/RouteSearchMenu.java @@ -0,0 +1,63 @@ +package subway.view; + +import java.util.Scanner; + +public class RouteSearchMenu { + private final String ROUTE_SEARCH_TITLE = "## 경로 기준"; + private final String MENU1 = "1. 최단 거리"; + private final String MENU2 = "2. 최소 시간"; + private final String BACK = "B. 돌아가기"; + private final String ENTER = "\n"; + private final String CHOICE_MENU = "## 원하는 기능을 선택하세요."; + private final String REQUEST_START = "## 출발역을 입력하세요."; + private final String REQUEST_ARRIVAL = "## 도착역을 입력하세요."; + + private Scanner scanner; + + public RouteSearchMenu(Scanner scanner) { + this.scanner = scanner; + } + + public void startRouteSearchMenu() { + outputRouteSearchMenu(); + String input = scanner.nextLine(); + System.out.println(); + inputMenu(input); + + } + + private void outputRouteSearchMenu() { + StringBuilder sb = new StringBuilder(); + sb.append(ROUTE_SEARCH_TITLE).append(ENTER) + .append(MENU1).append(ENTER) + .append(MENU2).append(ENTER) + .append(BACK).append(ENTER) + .append(ENTER) + .append(CHOICE_MENU); + System.out.println(sb); + } + + private void inputMenu(String input) { + while (true) { + if (input.equals("1")) { + requestStartStation(); + } + if (input.equals("2")) { + + } + if (input.equals("B")) { + return; + } + } + } + + private void requestStartStation() { + System.out.println(REQUEST_START); + String startStationName = scanner.nextLine(); + } + + private void requestArrivalStation() { + System.out.println(REQUEST_ARRIVAL); + String arrivalStationName = scanner.nextLine(); + } +} From 1fd64bdaeb43d4d2faffd7175d1b8f0740feaa4e Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 16:23:33 +0900 Subject: [PATCH 17/21] =?UTF-8?q?feat=20:=20=EC=B6=9C=EB=B0=9C=EC=97=AD?= =?UTF-8?q?=EA=B3=BC=20=EB=8F=84=EC=B0=A9=EC=97=AD=EC=9D=84=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20=EC=98=88=EC=99=B8=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/service/RouteSearchService.java | 4 ++ .../java/subway/util/StationValidator.java | 39 +++++++++++++++++++ .../java/subway/view/RouteSearchMenu.java | 12 +++++- 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/service/RouteSearchService.java create mode 100644 src/main/java/subway/util/StationValidator.java diff --git a/src/main/java/subway/service/RouteSearchService.java b/src/main/java/subway/service/RouteSearchService.java new file mode 100644 index 000000000..fdccc4ba7 --- /dev/null +++ b/src/main/java/subway/service/RouteSearchService.java @@ -0,0 +1,4 @@ +package subway.service; + +public class RouteSearchService { +} diff --git a/src/main/java/subway/util/StationValidator.java b/src/main/java/subway/util/StationValidator.java new file mode 100644 index 000000000..26b8f800c --- /dev/null +++ b/src/main/java/subway/util/StationValidator.java @@ -0,0 +1,39 @@ +package subway.util; + +import subway.domain.StationRepository; + +public class StationValidator { + private static final String ERROR = "[ERROR] "; + private static final String DUPLICATE_MESSAGE = "출발역과 도착역이 동일합니다."; + private static final String AVAILABLE_STATION_MESSAGE = "연결되어있지 않은 역입니다."; + private static final String NONEEXIST_STATION = "존재하지 않는 역입니다."; + + public static boolean checkVailableArrivalStation(String startStation, String arrivalStation) { + return isLinkedStation(startStation, arrivalStation) && ! duplicateStation(startStation, arrivalStation); + + } + + public static boolean haveStation(String name) { + if (StationRepository.findStationByName(name) != null) { + return true; + } + System.out.println(ERROR + NONEEXIST_STATION); + return false; + } + + public static boolean isLinkedStation(String startStation, String arrivalStation) { + if (StationRepository.findStationByName(arrivalStation) != null) { + return true; + } + System.out.println(ERROR + AVAILABLE_STATION_MESSAGE); + return false; + } + + public static boolean duplicateStation(String startStation, String arrivalStation) { + if (startStation.equals(arrivalStation)) { + System.out.println(ERROR + DUPLICATE_MESSAGE); + return true; + } + return false; + } +} diff --git a/src/main/java/subway/view/RouteSearchMenu.java b/src/main/java/subway/view/RouteSearchMenu.java index cd0c9b72b..c9b7cbbb6 100644 --- a/src/main/java/subway/view/RouteSearchMenu.java +++ b/src/main/java/subway/view/RouteSearchMenu.java @@ -1,5 +1,7 @@ package subway.view; +import subway.util.StationValidator; + import java.util.Scanner; public class RouteSearchMenu { @@ -43,7 +45,7 @@ private void inputMenu(String input) { requestStartStation(); } if (input.equals("2")) { - + requestStartStation(); } if (input.equals("B")) { return; @@ -54,10 +56,16 @@ private void inputMenu(String input) { private void requestStartStation() { System.out.println(REQUEST_START); String startStationName = scanner.nextLine(); + if (StationValidator.haveStation(startStationName)) { + requestArrivalStation(startStationName); + } } - private void requestArrivalStation() { + private void requestArrivalStation(String startStationName) { System.out.println(REQUEST_ARRIVAL); String arrivalStationName = scanner.nextLine(); + if (StationValidator.checkVailableArrivalStation(startStationName, arrivalStationName)) { + + } } } From c144fe5c76102c1fbb62452466fecc380f0d7f9c Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 16:29:58 +0900 Subject: [PATCH 18/21] =?UTF-8?q?fix=20:=20=EB=A9=94=EB=89=B4=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/Application.java | 3 +- src/main/java/subway/view/MainMenu.java | 30 +++++++++---------- .../java/subway/view/RouteSearchMenu.java | 13 ++++---- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 489f8eac5..5a4f7f105 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,5 +1,6 @@ package subway; +import subway.util.DefaultSetting; import subway.view.MainMenu; import java.util.Scanner; @@ -8,7 +9,7 @@ public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); // TODO: 프로그램 구현 - + DefaultSetting.defaultSetting(); new MainMenu(scanner).startMainMENU(); } } diff --git a/src/main/java/subway/view/MainMenu.java b/src/main/java/subway/view/MainMenu.java index 7d02de441..3ccecf90f 100644 --- a/src/main/java/subway/view/MainMenu.java +++ b/src/main/java/subway/view/MainMenu.java @@ -17,24 +17,14 @@ public MainMenu(Scanner scanner) { } public void startMainMENU() { - outputMainMenu(); - String input = scanner.nextLine(); - System.out.println(); - inputMenu(input); + inputMenu(); } - private void outputMainMenu() { - StringBuilder sb = new StringBuilder(); - sb.append(MAIN_TITLE).append(ENTER) - .append(MAINMENU_1).append(ENTER) - .append(QUIT_APP).append(ENTER) - .append(ENTER) - .append(CHOICE_MENU); - System.out.println(sb); - } - - private void inputMenu(String input) { + private void inputMenu() { while (true) { + outputMainMenu(); + String input = scanner.nextLine(); + System.out.println(); if (input.equals("1")) { new RouteSearchMenu(scanner).startRouteSearchMenu(); } @@ -45,4 +35,14 @@ private void inputMenu(String input) { } } } + + private void outputMainMenu() { + StringBuilder sb = new StringBuilder(); + sb.append(MAIN_TITLE).append(ENTER) + .append(MAINMENU_1).append(ENTER) + .append(QUIT_APP).append(ENTER) + .append(ENTER) + .append(CHOICE_MENU); + System.out.println(sb); + } } diff --git a/src/main/java/subway/view/RouteSearchMenu.java b/src/main/java/subway/view/RouteSearchMenu.java index c9b7cbbb6..86ad7d711 100644 --- a/src/main/java/subway/view/RouteSearchMenu.java +++ b/src/main/java/subway/view/RouteSearchMenu.java @@ -21,11 +21,7 @@ public RouteSearchMenu(Scanner scanner) { } public void startRouteSearchMenu() { - outputRouteSearchMenu(); - String input = scanner.nextLine(); - System.out.println(); - inputMenu(input); - + inputMenu(); } private void outputRouteSearchMenu() { @@ -39,8 +35,11 @@ private void outputRouteSearchMenu() { System.out.println(sb); } - private void inputMenu(String input) { + private void inputMenu() { while (true) { + outputRouteSearchMenu(); + String input = scanner.nextLine(); + System.out.println(); if (input.equals("1")) { requestStartStation(); } @@ -56,6 +55,7 @@ private void inputMenu(String input) { private void requestStartStation() { System.out.println(REQUEST_START); String startStationName = scanner.nextLine(); + System.out.println(); if (StationValidator.haveStation(startStationName)) { requestArrivalStation(startStationName); } @@ -64,6 +64,7 @@ private void requestStartStation() { private void requestArrivalStation(String startStationName) { System.out.println(REQUEST_ARRIVAL); String arrivalStationName = scanner.nextLine(); + System.out.println(); if (StationValidator.checkVailableArrivalStation(startStationName, arrivalStationName)) { } From 1696b6ae7b26f28a68de6d064c745a63840f44e8 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 16:55:27 +0900 Subject: [PATCH 19/21] =?UTF-8?q?feat=20:=20=EC=B5=9C=EB=8B=A8=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=B0=BE=EA=B8=B0=EC=9C=84=ED=95=9C=20Dis?= =?UTF-8?q?tanceRouteSearch=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/StationRepository.java | 3 + src/main/java/subway/util/DefaultSetting.java | 71 +++++++++---------- .../java/subway/util/DistanceRouteSearch.java | 25 +++++++ .../java/subway/util/StationValidator.java | 3 + .../java/subway/util/TimeRouteSearch.java | 4 ++ 5 files changed, 68 insertions(+), 38 deletions(-) create mode 100644 src/main/java/subway/util/DistanceRouteSearch.java create mode 100644 src/main/java/subway/util/TimeRouteSearch.java diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 27e400a28..0de597606 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -1,5 +1,7 @@ package subway.domain; +import subway.util.DistanceRouteSearch; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -14,6 +16,7 @@ public static List stations() { public static void addStation(Station station) { stations.add(station); + DistanceRouteSearch.addVertex(station.getName()); } public static boolean deleteStation(String name) { diff --git a/src/main/java/subway/util/DefaultSetting.java b/src/main/java/subway/util/DefaultSetting.java index d686f2703..af9141027 100644 --- a/src/main/java/subway/util/DefaultSetting.java +++ b/src/main/java/subway/util/DefaultSetting.java @@ -8,6 +8,16 @@ import subway.util.enums.DefaultStations; public class DefaultSetting { + private static final String KYODAE = "교대역"; + private static final String GANGNAM = "강남역"; + private static final String YEOKSAM = "역삼역"; + private static final String NORTH_TERMINAL = "남부터미널역"; + private static final String YANGJAE = "양재역"; + private static final String YANGJAE_CITIZEN_FOREST = "양재시민의숲역"; + private static final String MAEBONG = "매봉역"; + private static final String LINE2 = "2호선"; + private static final String LINE3 = "3호선"; + private static final String SINBUNDANG_LINE = "신분당선"; public static void defaultSetting() { for (DefaultStations ds : DefaultStations.values()) { @@ -18,43 +28,28 @@ public static void defaultSetting() { LineRepository.addLine(new Line(dl.getName())); } - Line line2 = LineRepository.findLineByName(DefaultLines.LINE2.getName()); - line2.addStation(DefaultStations.KYODAE.getName()); - line2.addStation(DefaultStations.GANGNAM.getName()); - line2.addStation(DefaultStations.YEOKSAM.getName()); - - Line line3 = LineRepository.findLineByName(DefaultLines.LINE3.getName()); - line3.addStation(DefaultStations.KYODAE.getName()); - line3.addStation(DefaultStations.NORTH_TERMINAL.getName()); - line3.addStation(DefaultStations.YANGJAE.getName()); - line3.addStation(DefaultStations.MAEBONG.getName()); - - Line sinBunDang = LineRepository.findLineByName(DefaultLines.SINBUNDANG_LINE.getName()); - sinBunDang.addStation(DefaultStations.GANGNAM.getName()); - sinBunDang.addStation(DefaultStations.YANGJAE.getName()); - sinBunDang.addStation(DefaultStations.YANGJAE_CITIZEN_FOREST.getName()); - - StationRepository.findStationByName(DefaultStations.KYODAE.getName()) - .addSection(DefaultStations.GANGNAM.getName(), 2, 3) - .addSection(DefaultStations.NORTH_TERMINAL.getName(), 3, 2); - StationRepository.findStationByName(DefaultStations.GANGNAM.getName()) - .addSection(DefaultStations.KYODAE.getName(), 2, 3) - .addSection(DefaultStations.YEOKSAM.getName(), 2, 3) - .addSection(DefaultStations.YANGJAE.getName(), 2, 8); - StationRepository.findStationByName(DefaultStations.YEOKSAM.getName()) - .addSection(DefaultStations.GANGNAM.getName(), 2, 3); - - StationRepository.findStationByName(DefaultStations.NORTH_TERMINAL.getName()) - .addSection(DefaultStations.KYODAE.getName(), 3, 2) - .addSection(DefaultStations.YANGJAE.getName(), 6, 5); - StationRepository.findStationByName(DefaultStations.YANGJAE.getName()) - .addSection(DefaultStations.NORTH_TERMINAL.getName(), 6, 5) - .addSection(DefaultStations.MAEBONG.getName(), 1, 1) - .addSection(DefaultStations.GANGNAM.getName(), 2, 8) - .addSection(DefaultStations.YANGJAE_CITIZEN_FOREST.getName(), 10, 3); - StationRepository.findStationByName(DefaultStations.MAEBONG.getName()) - .addSection(DefaultStations.YANGJAE.getName(), 1, 1); - StationRepository.findStationByName(DefaultStations.YANGJAE_CITIZEN_FOREST.getName()) - .addSection(DefaultStations.YANGJAE.getName(), 10, 3); + Line line2 = LineRepository.findLineByName(LINE2); + line2.addStation(KYODAE); + line2.addStation(GANGNAM); + line2.addStation(YEOKSAM); + + Line line3 = LineRepository.findLineByName(LINE3); + line3.addStation(KYODAE); + line3.addStation(NORTH_TERMINAL); + line3.addStation(YANGJAE); + line3.addStation(MAEBONG); + + Line sinBunDang = LineRepository.findLineByName(SINBUNDANG_LINE); + sinBunDang.addStation(GANGNAM); + sinBunDang.addStation(YANGJAE); + sinBunDang.addStation(YANGJAE_CITIZEN_FOREST); + + DistanceRouteSearch.addDisTanceEdgeWeight(KYODAE, GANGNAM, 2); + DistanceRouteSearch.addDisTanceEdgeWeight(GANGNAM, YEOKSAM, 2); + DistanceRouteSearch.addDisTanceEdgeWeight(KYODAE, NORTH_TERMINAL, 3); + DistanceRouteSearch.addDisTanceEdgeWeight(NORTH_TERMINAL, YANGJAE, 6); + DistanceRouteSearch.addDisTanceEdgeWeight(YANGJAE, MAEBONG, 1); + DistanceRouteSearch.addDisTanceEdgeWeight(GANGNAM, YANGJAE, 2); + DistanceRouteSearch.addDisTanceEdgeWeight(YANGJAE, YANGJAE_CITIZEN_FOREST, 10); } } diff --git a/src/main/java/subway/util/DistanceRouteSearch.java b/src/main/java/subway/util/DistanceRouteSearch.java new file mode 100644 index 000000000..054527e42 --- /dev/null +++ b/src/main/java/subway/util/DistanceRouteSearch.java @@ -0,0 +1,25 @@ +package subway.util; + +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +import java.util.List; + +public class DistanceRouteSearch { + private static final WeightedMultigraph distanceGraph + = new WeightedMultigraph<>(DefaultWeightedEdge.class); + + public static void addVertex(String stationName) { + distanceGraph.addVertex(stationName); + } + + public static void addDisTanceEdgeWeight(String station1, String station2, int distance) { + distanceGraph.setEdgeWeight(station1, station2, distance); + } + + public static List getShortestRoute(String startStation, String arrivalStation) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceGraph); + return dijkstraShortestPath.getPath(startStation, arrivalStation).getVertexList(); + } +} diff --git a/src/main/java/subway/util/StationValidator.java b/src/main/java/subway/util/StationValidator.java index 26b8f800c..e2b6b6841 100644 --- a/src/main/java/subway/util/StationValidator.java +++ b/src/main/java/subway/util/StationValidator.java @@ -18,6 +18,7 @@ public static boolean haveStation(String name) { return true; } System.out.println(ERROR + NONEEXIST_STATION); + System.out.println(); return false; } @@ -26,12 +27,14 @@ public static boolean isLinkedStation(String startStation, String arrivalStation return true; } System.out.println(ERROR + AVAILABLE_STATION_MESSAGE); + System.out.println(); return false; } public static boolean duplicateStation(String startStation, String arrivalStation) { if (startStation.equals(arrivalStation)) { System.out.println(ERROR + DUPLICATE_MESSAGE); + System.out.println(); return true; } return false; diff --git a/src/main/java/subway/util/TimeRouteSearch.java b/src/main/java/subway/util/TimeRouteSearch.java new file mode 100644 index 000000000..821ffeabe --- /dev/null +++ b/src/main/java/subway/util/TimeRouteSearch.java @@ -0,0 +1,4 @@ +package subway.util; + +public class TimeRouteSearch { +} From b25821a8ed54e039b8492d4ccb83dce655a2e3e3 Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 17:03:09 +0900 Subject: [PATCH 20/21] =?UTF-8?q?update=20:=20RouteSearchMenu=EC=9D=98=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/view/RouteSearchMenu.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/view/RouteSearchMenu.java b/src/main/java/subway/view/RouteSearchMenu.java index 86ad7d711..11e4ef551 100644 --- a/src/main/java/subway/view/RouteSearchMenu.java +++ b/src/main/java/subway/view/RouteSearchMenu.java @@ -15,6 +15,7 @@ public class RouteSearchMenu { private final String REQUEST_ARRIVAL = "## 도착역을 입력하세요."; private Scanner scanner; + private String input; public RouteSearchMenu(Scanner scanner) { this.scanner = scanner; @@ -38,7 +39,7 @@ private void outputRouteSearchMenu() { private void inputMenu() { while (true) { outputRouteSearchMenu(); - String input = scanner.nextLine(); + this.input = scanner.nextLine(); System.out.println(); if (input.equals("1")) { requestStartStation(); @@ -69,4 +70,21 @@ private void requestArrivalStation(String startStationName) { } } + + private void checkSearchMethod() { + if (input.equals("1")) { + searchShortestDistanceRoute(); + } + if (input.equals("2")) { + searchShortestTimeRoute(); + } + } + + private void searchShortestDistanceRoute() { + + } + + private void searchShortestTimeRoute() { + + } } From 18237d3bb4ee59a5fe037a9e81d2dd319f4ee69f Mon Sep 17 00:00:00 2001 From: Gomding Date: Sat, 19 Dec 2020 17:54:15 +0900 Subject: [PATCH 21/21] =?UTF-8?q?feat=20:=20=EC=B5=9C=EC=86=8C=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B2=BD=EB=A1=9C=EB=A5=BC=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Station.java | 18 +++++ .../java/subway/domain/StationRepository.java | 2 + .../java/subway/util/CalculatorRoute.java | 31 ++++++++ src/main/java/subway/util/DefaultSetting.java | 44 +++++++++-- .../java/subway/util/DistanceRouteSearch.java | 4 +- .../java/subway/util/TimeRouteSearch.java | 21 ++++++ .../subway/util/validator/MenuValidator.java | 24 ++++++ .../{ => validator}/StationValidator.java | 2 +- src/main/java/subway/view/MainMenu.java | 5 +- .../java/subway/view/RouteSearchMenu.java | 73 +++++++++++++------ 10 files changed, 191 insertions(+), 33 deletions(-) create mode 100644 src/main/java/subway/util/CalculatorRoute.java create mode 100644 src/main/java/subway/util/validator/MenuValidator.java rename src/main/java/subway/util/{ => validator}/StationValidator.java (98%) diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index 0cf5dbd80..c6022790c 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -36,4 +36,22 @@ public Station addSection(String linkedStationName, int distance, int time) { public List
sections() { return Collections.unmodifiableList(sectionList); } + + public int getSectionDistance(String stationName) { + for (Section section : sectionList) { + if (section.getLinkedStationName().equals(stationName)) { + return section.getDistance(); + } + } + return 0; + } + + public int getSectionTime(String stationName) { + for (Section section : sectionList) { + if (section.getLinkedStationName().equals(stationName)) { + return section.getTime(); + } + } + return 0; + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 0de597606..ae0194700 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -1,6 +1,7 @@ package subway.domain; import subway.util.DistanceRouteSearch; +import subway.util.TimeRouteSearch; import java.util.ArrayList; import java.util.Collections; @@ -17,6 +18,7 @@ public static List stations() { public static void addStation(Station station) { stations.add(station); DistanceRouteSearch.addVertex(station.getName()); + TimeRouteSearch.addVertex(station.getName()); } public static boolean deleteStation(String name) { diff --git a/src/main/java/subway/util/CalculatorRoute.java b/src/main/java/subway/util/CalculatorRoute.java new file mode 100644 index 000000000..7096887d4 --- /dev/null +++ b/src/main/java/subway/util/CalculatorRoute.java @@ -0,0 +1,31 @@ +package subway.util; + +import subway.domain.Station; +import subway.domain.StationRepository; + +import java.util.List; + +public class CalculatorRoute { + + public static int calculatorRoutDistance(List stationList) { + int result = 0; + String tempStataion = stationList.get(0); + for (int i = 1; i < stationList.size(); i++) { + Station station = StationRepository.findStationByName(tempStataion); + result += station.getSectionDistance(stationList.get(i)); + tempStataion = stationList.get(i); + } + return result; + } + + public static int calculatorRouteTime(List stationList) { + int result = 0; + String tempStataion = stationList.get(0); + for (int i = 1; i < stationList.size(); i++) { + Station station = StationRepository.findStationByName(tempStataion); + result += station.getSectionTime(stationList.get(i)); + tempStataion = stationList.get(i); + } + return result; + } +} diff --git a/src/main/java/subway/util/DefaultSetting.java b/src/main/java/subway/util/DefaultSetting.java index af9141027..387479395 100644 --- a/src/main/java/subway/util/DefaultSetting.java +++ b/src/main/java/subway/util/DefaultSetting.java @@ -44,12 +44,42 @@ public static void defaultSetting() { sinBunDang.addStation(YANGJAE); sinBunDang.addStation(YANGJAE_CITIZEN_FOREST); - DistanceRouteSearch.addDisTanceEdgeWeight(KYODAE, GANGNAM, 2); - DistanceRouteSearch.addDisTanceEdgeWeight(GANGNAM, YEOKSAM, 2); - DistanceRouteSearch.addDisTanceEdgeWeight(KYODAE, NORTH_TERMINAL, 3); - DistanceRouteSearch.addDisTanceEdgeWeight(NORTH_TERMINAL, YANGJAE, 6); - DistanceRouteSearch.addDisTanceEdgeWeight(YANGJAE, MAEBONG, 1); - DistanceRouteSearch.addDisTanceEdgeWeight(GANGNAM, YANGJAE, 2); - DistanceRouteSearch.addDisTanceEdgeWeight(YANGJAE, YANGJAE_CITIZEN_FOREST, 10); + StationRepository.findStationByName(KYODAE) + .addSection(GANGNAM, 2, 3) + .addSection(DefaultStations.NORTH_TERMINAL.getName(), 3, 2); + StationRepository.findStationByName(GANGNAM) + .addSection(KYODAE, 2, 3) + .addSection(YEOKSAM, 2, 3) + .addSection(YANGJAE, 2, 8); + StationRepository.findStationByName(YEOKSAM) + .addSection(GANGNAM, 2, 3); + StationRepository.findStationByName(NORTH_TERMINAL) + .addSection(KYODAE, 3, 2) + .addSection(YANGJAE, 6, 5); + StationRepository.findStationByName(YANGJAE) + .addSection(NORTH_TERMINAL, 6, 5) + .addSection(MAEBONG, 1, 1) + .addSection(GANGNAM, 2, 8) + .addSection(YANGJAE_CITIZEN_FOREST, 10, 3); + StationRepository.findStationByName(MAEBONG) + .addSection(YANGJAE, 1, 1); + StationRepository.findStationByName(YANGJAE_CITIZEN_FOREST) + .addSection(YANGJAE, 10, 3); + + DistanceRouteSearch.addDistanceEdgeWeight(KYODAE, GANGNAM, 2); + DistanceRouteSearch.addDistanceEdgeWeight(GANGNAM, YEOKSAM, 2); + DistanceRouteSearch.addDistanceEdgeWeight(KYODAE, NORTH_TERMINAL, 3); + DistanceRouteSearch.addDistanceEdgeWeight(NORTH_TERMINAL, YANGJAE, 6); + DistanceRouteSearch.addDistanceEdgeWeight(YANGJAE, MAEBONG, 1); + DistanceRouteSearch.addDistanceEdgeWeight(GANGNAM, YANGJAE, 2); + DistanceRouteSearch.addDistanceEdgeWeight(YANGJAE, YANGJAE_CITIZEN_FOREST, 10); + + TimeRouteSearch.addDistanceEdgeWeight(KYODAE, GANGNAM, 3); + TimeRouteSearch.addDistanceEdgeWeight(GANGNAM, YEOKSAM, 3); + TimeRouteSearch.addDistanceEdgeWeight(KYODAE, NORTH_TERMINAL, 2); + TimeRouteSearch.addDistanceEdgeWeight(NORTH_TERMINAL, YANGJAE, 5); + TimeRouteSearch.addDistanceEdgeWeight(YANGJAE, MAEBONG, 1); + TimeRouteSearch.addDistanceEdgeWeight(GANGNAM, YANGJAE, 8); + TimeRouteSearch.addDistanceEdgeWeight(YANGJAE, YANGJAE_CITIZEN_FOREST, 3); } } diff --git a/src/main/java/subway/util/DistanceRouteSearch.java b/src/main/java/subway/util/DistanceRouteSearch.java index 054527e42..8e92cfa31 100644 --- a/src/main/java/subway/util/DistanceRouteSearch.java +++ b/src/main/java/subway/util/DistanceRouteSearch.java @@ -14,8 +14,8 @@ public static void addVertex(String stationName) { distanceGraph.addVertex(stationName); } - public static void addDisTanceEdgeWeight(String station1, String station2, int distance) { - distanceGraph.setEdgeWeight(station1, station2, distance); + public static void addDistanceEdgeWeight(String station1, String station2, int distance) { + distanceGraph.setEdgeWeight(distanceGraph.addEdge(station1, station2), distance); } public static List getShortestRoute(String startStation, String arrivalStation) { diff --git a/src/main/java/subway/util/TimeRouteSearch.java b/src/main/java/subway/util/TimeRouteSearch.java index 821ffeabe..76c8a48de 100644 --- a/src/main/java/subway/util/TimeRouteSearch.java +++ b/src/main/java/subway/util/TimeRouteSearch.java @@ -1,4 +1,25 @@ package subway.util; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +import java.util.List; + public class TimeRouteSearch { + private static final WeightedMultigraph timeGraph + = new WeightedMultigraph<>(DefaultWeightedEdge.class); + + public static void addVertex(String stationName) { + timeGraph.addVertex(stationName); + } + + public static void addDistanceEdgeWeight(String station1, String station2, int distance) { + timeGraph.setEdgeWeight(timeGraph.addEdge(station1, station2), distance); + } + + public static List getShortestRoute(String startStation, String arrivalStation) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(timeGraph); + return dijkstraShortestPath.getPath(startStation, arrivalStation).getVertexList(); + } } diff --git a/src/main/java/subway/util/validator/MenuValidator.java b/src/main/java/subway/util/validator/MenuValidator.java new file mode 100644 index 000000000..2959cc417 --- /dev/null +++ b/src/main/java/subway/util/validator/MenuValidator.java @@ -0,0 +1,24 @@ +package subway.util.validator; + +public class MenuValidator { + private static final String ERROR = "[ ERROR ] "; + private static final String MENU_ERROR = "존재하지않는 메뉴입니다."; + + public static boolean isVailableMainMenu(String input) { + if (input.equals("1") || input.equals("Q")) { + return true; + } + System.out.println(ERROR + MENU_ERROR); + System.out.println(); + return false; + } + + public static boolean isVailableRouteSearchMenu(String input) { + if (input.equals("1") || input.equals("2") || input.equals("B")) { + return true; + } + System.out.println(ERROR + MENU_ERROR); + System.out.println(); + return false; + } +} diff --git a/src/main/java/subway/util/StationValidator.java b/src/main/java/subway/util/validator/StationValidator.java similarity index 98% rename from src/main/java/subway/util/StationValidator.java rename to src/main/java/subway/util/validator/StationValidator.java index e2b6b6841..d9f024d0b 100644 --- a/src/main/java/subway/util/StationValidator.java +++ b/src/main/java/subway/util/validator/StationValidator.java @@ -1,4 +1,4 @@ -package subway.util; +package subway.util.validator; import subway.domain.StationRepository; diff --git a/src/main/java/subway/view/MainMenu.java b/src/main/java/subway/view/MainMenu.java index 3ccecf90f..f4f56aa67 100644 --- a/src/main/java/subway/view/MainMenu.java +++ b/src/main/java/subway/view/MainMenu.java @@ -1,5 +1,7 @@ package subway.view; +import subway.util.validator.MenuValidator; + import java.util.Scanner; public class MainMenu { @@ -25,17 +27,18 @@ private void inputMenu() { outputMainMenu(); String input = scanner.nextLine(); System.out.println(); + MenuValidator.isVailableMainMenu(input); if (input.equals("1")) { new RouteSearchMenu(scanner).startRouteSearchMenu(); } if (input.equals("Q")) { - System.out.println(); System.out.println(QUIT_MESSAGE); return; } } } + private void outputMainMenu() { StringBuilder sb = new StringBuilder(); sb.append(MAIN_TITLE).append(ENTER) diff --git a/src/main/java/subway/view/RouteSearchMenu.java b/src/main/java/subway/view/RouteSearchMenu.java index 11e4ef551..2f0e3223e 100644 --- a/src/main/java/subway/view/RouteSearchMenu.java +++ b/src/main/java/subway/view/RouteSearchMenu.java @@ -1,7 +1,12 @@ package subway.view; -import subway.util.StationValidator; +import subway.util.CalculatorRoute; +import subway.util.DistanceRouteSearch; +import subway.util.validator.MenuValidator; +import subway.util.validator.StationValidator; +import subway.util.TimeRouteSearch; +import java.util.List; import java.util.Scanner; public class RouteSearchMenu { @@ -13,9 +18,13 @@ public class RouteSearchMenu { private final String CHOICE_MENU = "## 원하는 기능을 선택하세요."; private final String REQUEST_START = "## 출발역을 입력하세요."; private final String REQUEST_ARRIVAL = "## 도착역을 입력하세요."; + private final String LINE = "---"; + private final String INFO = "[ INFO ] "; private Scanner scanner; private String input; + private String startStationName; + private String arrivalStationName; public RouteSearchMenu(Scanner scanner) { this.scanner = scanner; @@ -25,26 +34,13 @@ public void startRouteSearchMenu() { inputMenu(); } - private void outputRouteSearchMenu() { - StringBuilder sb = new StringBuilder(); - sb.append(ROUTE_SEARCH_TITLE).append(ENTER) - .append(MENU1).append(ENTER) - .append(MENU2).append(ENTER) - .append(BACK).append(ENTER) - .append(ENTER) - .append(CHOICE_MENU); - System.out.println(sb); - } - private void inputMenu() { while (true) { outputRouteSearchMenu(); this.input = scanner.nextLine(); System.out.println(); - if (input.equals("1")) { - requestStartStation(); - } - if (input.equals("2")) { + MenuValidator.isVailableRouteSearchMenu(input); + if (input.equals("1") || input.equals("2")) { requestStartStation(); } if (input.equals("B")) { @@ -55,19 +51,19 @@ private void inputMenu() { private void requestStartStation() { System.out.println(REQUEST_START); - String startStationName = scanner.nextLine(); + this.startStationName = scanner.nextLine(); System.out.println(); if (StationValidator.haveStation(startStationName)) { - requestArrivalStation(startStationName); + requestArrivalStation(); } } - private void requestArrivalStation(String startStationName) { + private void requestArrivalStation() { System.out.println(REQUEST_ARRIVAL); - String arrivalStationName = scanner.nextLine(); + this.arrivalStationName = scanner.nextLine(); System.out.println(); if (StationValidator.checkVailableArrivalStation(startStationName, arrivalStationName)) { - + checkSearchMethod(); } } @@ -81,10 +77,43 @@ private void checkSearchMethod() { } private void searchShortestDistanceRoute() { - + List list = DistanceRouteSearch.getShortestRoute(startStationName, arrivalStationName); + int time = CalculatorRoute.calculatorRouteTime(list); + int distance = CalculatorRoute.calculatorRoutDistance(list); + System.out.println("## 조회결과"); + System.out.println(LINE); + System.out.println("총 거리: " + distance + "km"); + System.out.println("총 소요 시간 : " + time + "분"); + System.out.println(LINE); + for (String station : list) { + System.out.println(INFO + station); + } + System.out.println(); } private void searchShortestTimeRoute() { + List list = TimeRouteSearch.getShortestRoute(startStationName, arrivalStationName); + int time = CalculatorRoute.calculatorRouteTime(list); + int distance = CalculatorRoute.calculatorRoutDistance(list); + System.out.println("## 조회결과"); + System.out.println(LINE); + System.out.println("총 거리: " + distance + "km"); + System.out.println("총 소요 시간 : " + time + "분"); + System.out.println(LINE); + for (String station : list) { + System.out.println(INFO + station); + } + System.out.println(); + } + private void outputRouteSearchMenu() { + StringBuilder sb = new StringBuilder(); + sb.append(ROUTE_SEARCH_TITLE).append(ENTER) + .append(MENU1).append(ENTER) + .append(MENU2).append(ENTER) + .append(BACK).append(ENTER) + .append(ENTER) + .append(CHOICE_MENU); + System.out.println(sb); } }