Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
1efaff7
docs: 기능 목록 작성
JinseongHwang Dec 19, 2020
87fc4ab
feat: 초기화할 역들의 이름을 enum에서 정의
JinseongHwang Dec 19, 2020
5eaf89d
feat: 초기화할 노선들의 이름을 enum에서 정의
JinseongHwang Dec 19, 2020
ad48e0c
feat: 초기 설정할 역과 노선들을 등록
JinseongHwang Dec 19, 2020
389d9cf
feat: 연결된 역 사이의 거리와 시간을 저장하는 클래스 생성
JinseongHwang Dec 19, 2020
df6af20
feat: 모든 Connection 객체들을 저장하는 클래스 생성
JinseongHwang Dec 19, 2020
5a44bf5
feat: 역 사이의 Connection 초기 설정 추가
JinseongHwang Dec 19, 2020
49b58fe
feat: 메인 화면에서 선택할 수 있는 기능 버튼 생성
JinseongHwang Dec 19, 2020
4b1d938
feat: 경로 선택 화면에서 선택할 수 있는 기능 버튼 생성
JinseongHwang Dec 19, 2020
2137b04
feat: 예외 상황을 제외한 출력 함수 구현
JinseongHwang Dec 19, 2020
63195c7
feat: 선택 가능한 기능인지 검증 함수 추가
JinseongHwang Dec 19, 2020
d035375
feat: 예외 상황 출력 구문 추가
JinseongHwang Dec 19, 2020
51a75d4
feat: 메인 화면에서 기능 입력부 구현
JinseongHwang Dec 19, 2020
c7016b2
feat: 기능 입력 시 선택 가능한 입력인지 검증
JinseongHwang Dec 19, 2020
7dfa518
feat: 메인 화면 실행 테스트 완료
JinseongHwang Dec 19, 2020
a425862
feat: 메인 화면의 기능 구현 완료
JinseongHwang Dec 19, 2020
8a5987a
refactor: 직관적인 변수명으로 변경
JinseongHwang Dec 19, 2020
b26c966
feat: 경로 기준 선택 화면에서 입력 기능 구현 완료 및 테스트
JinseongHwang Dec 19, 2020
f5fc7cc
feat: 출발, 도착 역을 입력 받는 기능 구현
JinseongHwang Dec 19, 2020
73add24
feat: InputView 객체를 PathController에서도 사용할 수 있게 생성자에서 전달하는 방식으로 변경
JinseongHwang Dec 19, 2020
f7d25e6
feat: 다시 입력하라는 메시지 추가
JinseongHwang Dec 19, 2020
d2cab49
feat: 역을 입력받고 존재하는 역인지, 같은 역을 입력했는지 검증
JinseongHwang Dec 19, 2020
cbc7ac0
feat: 존재하는 역인지 답해주는 함수 구현
JinseongHwang Dec 19, 2020
16343e1
feat: 출발역과 도착역을 입력받고 검증 함수 호출
JinseongHwang Dec 19, 2020
8854a01
refactor: 불필요한 import문을 제거
JinseongHwang Dec 19, 2020
3124248
refactor: 패키지 이동
JinseongHwang Dec 19, 2020
80a5d11
feat: 그래프 초기화 함수 추가
JinseongHwang Dec 19, 2020
ff25be8
refactor: Connections에서 ConnectionRepository로 이름 변경
JinseongHwang Dec 19, 2020
f71cb2d
feat: 각 요소에 관한 Getter 함수 생성
JinseongHwang Dec 19, 2020
222a747
feat: 거리를 가중치로 하는 그래프를 일급 컬렉션 형태로 저장
JinseongHwang Dec 19, 2020
b041b21
feat: 시간을 가중치로 하는 그래프를 일급 컬렉션 형태로 저장
JinseongHwang Dec 19, 2020
0711b44
feat: 거리를 가중치로 최적의 경로를 반환하는 함수 구현
JinseongHwang Dec 19, 2020
155c736
feat: 시간을 가중치로 최적의 경로를 반환하는 함수 구현
JinseongHwang Dec 19, 2020
6df3245
feat: 조회 결과 출력 함수 구현
JinseongHwang Dec 19, 2020
b686104
refactor: 클래스명 변경
JinseongHwang Dec 19, 2020
29743bd
refactor: 사용하지 않는 함수 제거
JinseongHwang Dec 19, 2020
b046bd6
refactor: final 키워드 추가
JinseongHwang Dec 19, 2020
97c81de
refactor
JinseongHwang Dec 19, 2020
File filter

Filter by extension

Filter by extension

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

*작성자: 황진성(eddy5360@naver.com)*

우아한 테크코스 3기 웹 백엔드 선발 과정 최종 코딩테스트입니다.

<br>

## 📃 구현할 기능 목록

<br>

* 초기 설정
```
- 노선, 역, 거리, 시간 정보들을 초기화한다.
- 방향이 정해져있지 않으므로 경로를 양방향으로 설정한다.
```

* 경로 조회 기능
```
- 출발역과 도착역을 입력받는다.
- 최단거리 또는 최소시간 기준으로 경로를 조회할 수 있다.
[예외상황]
- 출발역과 도착역이 동일하다.
- 출발역에서 도착역으로 갈 수 없다(연결되어있지 않다.)
```

<br>

## ✍ 클래스 설계 목록

<br>

## domain

* Line
```
- 노선의 이름을 저장한다.
```

* LineRepository
```
- 노선들의 목록을 저장한다.
```

* Station
```
- 역의 이름을 저장한다.
```

* StationRepository
```
- 역들의 목록을 저장한다.
```

* Connection
```
- 연결된 역 사이의 시간과 거리를 저장한다.
```

* ConnectionRepository
```
- 모든 Connection 객체들을 일급 컬렉션 형태로 저장한다.
```


## view

* InputView
```
- 기능 선택
- 출발, 도착 역 입력
```

* OutputView
```
- 메인 화면 출력
- 1. 경로 조회
- Q. 종료
- 경로 조회 화면 출력
- 1. 최단거리
- 2. 최소시간
- B. 돌아가기
- 조회 결과 출력
```


## controller

* MainController
```
- 메인 화면을 출력하고, 입력받은 기능 값에 의존해 다음 기능을 수행한다.
```

* InquirePathController
```
- 경로 기준 화면을 출력하고, 입력받은 기능 값에 의존해 경로를 조회한다.
```


## util

* Validator
```
- 현재 화면에서 선택할 수 있는 기능인지 검증한다.
- 출발역과 도착역이 같은지 검증한다.
- 존재하는 역을 입력했는지 검증한다.
- 서로 연결된 역인지 검증한다.
```
11 changes: 10 additions & 1 deletion src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package subway;

import subway.controller.MainController;
import subway.util.Initialization;
import subway.view.InputView;

import java.util.Scanner;

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

scanner.close();
}
}
15 changes: 15 additions & 0 deletions src/main/java/subway/controller/MainButton.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package subway.controller;

public enum MainButton {
INQUIRY("1"), EXIT("Q");

private String symbol;

MainButton(String symbol) {
this.symbol = symbol;
}

public String getSymbol() {
return symbol;
}
}
37 changes: 37 additions & 0 deletions src/main/java/subway/controller/MainController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package subway.controller;

import subway.view.InputView;
import subway.view.OutputView;

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

public class MainController {

private final InputView inputView;
private final PathController pathController;

public MainController(InputView inputView) {
this.inputView = inputView;
pathController = new PathController(inputView);
}

private final List<String> buttons = Arrays.asList(
MainButton.INQUIRY.getSymbol(),
MainButton.EXIT.getSymbol()
);

public void run() {
OutputView.printMain();
String selectedButton = inputView.getFunctionSelect(buttons);
nextProcedure(selectedButton);
}

private void nextProcedure(final String button) {
if (button.equals(MainButton.INQUIRY.getSymbol())) {
pathController.run();
run();
}
}

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

public enum PathButton {
SHORTEST_PATH("1"), LEAST_TIME("2"), BACK("B");

private String symbol;

PathButton(String symbol) {
this.symbol = symbol;
}

public String getSymbol() {
return symbol;
}
}
54 changes: 54 additions & 0 deletions src/main/java/subway/controller/PathController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package subway.controller;

import subway.graph.DistanceWeightedGraph;
import subway.graph.TimeWeightedGraph;
import subway.util.Validator;
import subway.view.InputView;
import subway.view.OutputView;

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

public class PathController {

private final InputView inputView;

public PathController(InputView inputView) {
this.inputView = inputView;
}

private final List<String> buttons = Arrays.asList(
PathButton.SHORTEST_PATH.getSymbol(),
PathButton.LEAST_TIME.getSymbol(),
PathButton.BACK.getSymbol()
);

public void run() {
OutputView.printInquiry();
String selectedButton = inputView.getFunctionSelect(buttons);
nextProcedure(selectedButton);
}

private void nextProcedure(final String button) {
if (button.equals(PathButton.BACK.getSymbol())) {
return;
}
String source = inputView.getSourceStation();
String destination = inputView.getDestinationStation();
if (Validator.sameStation(source, destination)) {
nextProcedure(button);
return;
}
if (Validator.unconnected(source, destination)) {
nextProcedure(button);
return;
}
// 총 시간과 거리를 계산하는 함수를 구현하지 못했습니다.
if (button.equals(PathButton.SHORTEST_PATH.getSymbol())) {
OutputView.printInquiryGraph(DistanceWeightedGraph.getOptimalGraph(source, destination), -1, -1);
} else if (button.equals(PathButton.LEAST_TIME.getSymbol())) {
OutputView.printInquiryGraph(TimeWeightedGraph.getOptimalGraph(source, destination), -1, -1);
}
}

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

public class Connection {

private final String source;
private final String destination;
private final int distance; // (km) 단위
private final int time; // (분) 단위

public Connection(final String source, final String destination, final int distance, final int time) {
this.source = source;
this.destination = destination;
this.distance = distance;
this.time = time;
}

public Connection getReverse() {
return new Connection(destination, source, distance, time);
}

public String getSource() {
return source;
}

public String getDestination() {
return destination;
}

public int getDistance() {
return distance;
}

public int getTime() {
return time;
}
}
18 changes: 18 additions & 0 deletions src/main/java/subway/domain/ConnectionRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package subway.domain;

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

public class ConnectionRepository {

private static List<Connection> connections = new ArrayList<>();

public static void addConnection(Connection connection) {
connections.add(connection);
connections.add(connection.getReverse());
}

public static List<Connection> connections() {
return connections;
}
}
10 changes: 10 additions & 0 deletions src/main/java/subway/domain/StationRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,14 @@ public static boolean deleteStation(String name) {
public static void deleteAll() {
stations.clear();
}

public static boolean isExist(String stationName) {
for (Station station : stations) {
if (station.getName().equals(stationName)) {
return true;
}
}
return false;
}

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

import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.WeightedMultigraph;

import java.util.List;

public class DistanceWeightedGraph {

private static final WeightedMultigraph<String, DefaultWeightedEdge> graph = new WeightedMultigraph(DefaultWeightedEdge.class);

public static void addVertex(String vertex) {
graph.addVertex(vertex);
}

public static DefaultWeightedEdge addEdge(String source, String destination) {
return graph.addEdge(source, destination);
}

public static void setEdgeWeight(DefaultWeightedEdge DWE, double weight) {
graph.setEdgeWeight(DWE, weight);
}

public static List<String> getOptimalGraph(String source, String destination) {
DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph);
List<String> optimalGraph = dijkstraShortestPath.getPath(source, destination).getVertexList();
return optimalGraph;
}

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

import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.WeightedMultigraph;

import java.util.List;

public class TimeWeightedGraph {

private static final WeightedMultigraph<String, DefaultWeightedEdge> graph = new WeightedMultigraph(DefaultWeightedEdge.class);

public static void addVertex(String vertex) {
graph.addVertex(vertex);
}

public static DefaultWeightedEdge addEdge(String source, String destination) {
return graph.addEdge(source, destination);
}

public static void setEdgeWeight(DefaultWeightedEdge DWE, double weight) {
graph.setEdgeWeight(DWE, weight);
}

public static List<String> getOptimalGraph(String source, String destination) {
DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph);
List<String> optimalGraph = dijkstraShortestPath.getPath(source, destination).getVertexList();
return optimalGraph;
}

}
Loading