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);
}
}