Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@

<br>

## ✅ 구현할 기능 목록
- [x] 지하철 노선도 경로 조회 인터페이스
- [입출력 요구사항](#-입출력-요구사항)의 양식에 맞추어 출력을 한다.
- 존재하지 않는 기능의 입력이면 에러를 출력한다.
- [x] 구간 모델 구현
- 구간에는 노선의 이름, 역 사이의 거리와 시간이 필요하다.
- [x] 초기 설정 구현
- [기능 요구사항](#-기능-요구사항)에따라 초기 설정을 하도록 구현한다.
- [x] 최단 경로 기능의 입력 구현
- 존재하지 않은 역의 입력인 경우 예외 처리
- 출발역과 도착역이 같은 경우 예외 처리
- [x] 최단 경로 찾기 기능 구현
- 출발역과 도착역이 연결되어 있지 않으면 예외 처리
- [ ] 총 이동거리 및 소요 시간 출력

## 🚀 기능 요구사항

> 프리코스 3주차 미션에서 사용한 코드를 참고해도 무관하다.
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package subway;

import java.io.PrintStream;
import java.util.Scanner;
import subway.controller.MainController;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
final PrintStream printStream = new PrintStream(System.out);
InitialSetup.apply();
final MainController mainController = new MainController(scanner, printStream);
mainController.run();
}
}
19 changes: 19 additions & 0 deletions src/main/java/subway/Error.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package subway;

public enum Error {
OK("오류 없음"),
INVALID_MENU("존재하지 않는 기능입니다."),
SAME_STATIONS("출발역과 도착역이 동일합니다."),
STATION_NOT_EXISTS("존재하지 않는 역입니다."),
STATION_NOT_CONNECTED("역이 연결되어 있지 않습니다.");

private final String message;

private Error(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}
66 changes: 66 additions & 0 deletions src/main/java/subway/InitialSetup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package subway;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import subway.domain.Line;
import subway.domain.LineRepository;
import subway.domain.Station;
import subway.domain.StationRepository;

public class InitialSetup {
private static final String[] STATIONS =
{"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"};
private static final LinkedHashMap<String, List<String>> STATIONS_OF_LINE =
new LinkedHashMap<String, List<String>>();
private static final LinkedHashMap<String, List<Integer>> DISTANCES_OF_LINE =
new LinkedHashMap<String, List<Integer>>();
private static final LinkedHashMap<String, List<Integer>> TIMES_OF_LINE =
new LinkedHashMap<String, List<Integer>>();

static {
STATIONS_OF_LINE.put("2호선", Arrays.asList("교대역", "강남역", "역삼역"));
STATIONS_OF_LINE.put("3호선", Arrays.asList("교대역", "남부터미널역", "양재역", "매봉역"));
STATIONS_OF_LINE.put("신분당선", Arrays.asList("강남역", "양재역", "양재시민의숲역"));

DISTANCES_OF_LINE.put("2호선", Arrays.asList(2, 2));
DISTANCES_OF_LINE.put("3호선", Arrays.asList(3, 6, 1));
DISTANCES_OF_LINE.put("신분당선", Arrays.asList(2, 10));

TIMES_OF_LINE.put("2호선", Arrays.asList(3, 3));
TIMES_OF_LINE.put("3호선", Arrays.asList(2, 5, 1));
TIMES_OF_LINE.put("신분당선", Arrays.asList(8, 3));
}

public static void apply() {
applyStations();
applyLines();
}

private static void applyStations() {
for (String stationName : STATIONS) {
StationRepository.addStation(new Station(stationName));
}
}

private static void applyLines() {
for (String lineName : STATIONS_OF_LINE.keySet()) {
Line currentLine = new Line(lineName);
LineRepository.addLine(currentLine);
applyStationsOfLine(currentLine, STATIONS_OF_LINE.get(lineName));
}
}

private static void applyStationsOfLine(Line line, List<String> stationNames) {
List<Integer> distances = DISTANCES_OF_LINE.get(line.getName());
List<Integer> times = TIMES_OF_LINE.get(line.getName());
for (int index = 0; index < stationNames.size(); index++) {
Station currentStation = StationRepository.getStationbyName(stationNames.get(index));
if (index == 0) {
line.registerFirstStation(currentStation);
continue;
}
line.pushSections(currentStation, distances.get(index - 1), times.get(index - 1));
}
}
}
48 changes: 48 additions & 0 deletions src/main/java/subway/Scene.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package subway;

import java.io.PrintStream;
import java.util.Scanner;
import java.util.Stack;
import subway.controller.MainViewController;
import subway.controller.ViewController;

public class Scene {
private final Scanner scanner;
private final PrintStream printStream;
private final Stack<ViewController> controllers = new Stack<ViewController>();

public Scene(Scanner scanner, PrintStream printStream) {
this.scanner = scanner;
this.printStream = printStream;
controllers.add(new MainViewController(scanner, printStream));
}

public void runCurrentView() {
ViewController viewController = controllers.peek();
viewController.run(this);
}

public void goView(ViewController controller) {
controllers.push(controller);
}

public void back() {
controllers.pop();
}

public void exit() {
controllers.clear();
}

public boolean isExit() {
return controllers.empty();
}

public Scanner getScanner() {
return scanner;
}

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

import java.io.PrintStream;
import java.util.Scanner;
import subway.Scene;

public class MainController {
Scene scene;

public MainController(Scanner scanner, PrintStream printStream) {
scene = new Scene(scanner, printStream);
}

public void run() {
while (!scene.isExit()) {
scene.runCurrentView();
}
}
}
35 changes: 35 additions & 0 deletions src/main/java/subway/controller/MainViewController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package subway.controller;

import java.io.PrintStream;
import java.util.Scanner;
import java.util.function.BiConsumer;
import subway.Error;
import subway.Scene;
import subway.menu.MainMenu;
import subway.view.MainView;
import subway.view.View;

public class MainViewController extends ViewController {

public MainViewController(Scanner scanner, PrintStream printStream) {
view = new MainView(scanner, printStream);
}

@Override
public BiConsumer<Scene, View> selectMenu() {
String input = view.requestMenu();
BiConsumer<Scene, View> result = MainMenu.getAction(input);
if (result == null) {
view.printError(Error.INVALID_MENU);
}
return result;
}

public static void goSectionView(Scene scene, View view) {
scene.goView(new SectionViewController(scene.getScanner(), scene.getPrinstream()));
}

public static void exit(Scene scene, View view) {
scene.exit();
}
}
101 changes: 101 additions & 0 deletions src/main/java/subway/controller/SectionViewController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package subway.controller;

import java.io.PrintStream;
import java.util.List;
import java.util.Scanner;
import java.util.function.BiConsumer;
import subway.Error;
import subway.Scene;
import subway.domain.PathFinder;
import subway.domain.Station;
import subway.domain.StationRepository;
import subway.menu.SectionMenu;
import subway.view.SectionView;
import subway.view.View;

public class SectionViewController extends ViewController {

public SectionViewController(Scanner scanner, PrintStream printStream) {
view = new SectionView(scanner, printStream);
}

@Override
public BiConsumer<Scene, View> selectMenu() {
String input = view.requestMenu();
BiConsumer<Scene, View> result = SectionMenu.getAction(input);
if (result == null) {
view.printError(Error.INVALID_MENU);
}
return result;
}

public static void findMinDistance(Scene scene, View view) {
String departureInput = view.requestDepartureStation();
String arrivalInput = view.requestArrivalStation();
Error error = isValidStations(departureInput, arrivalInput);
if (error != Error.OK) {
view.printError(error);
return;
}
List<String> path = findMinDistancePath(departureInput, arrivalInput, view);
if (path == null) {
return;
}
view.printPath(path);
scene.back();
}

private static List<String> findMinDistancePath(String departureInput, String arrivalInput,
View view) {
Station departureStation = StationRepository.getStationbyName(departureInput);
Station arrivalStation = StationRepository.getStationbyName(arrivalInput);
List<String> path = PathFinder.findMinDistancePath(departureStation, arrivalStation);
if (path == null) {
view.printError(Error.STATION_NOT_CONNECTED);
}
return path;
}

public static void findMinTime(Scene scene, View view) {
String departureInput = view.requestDepartureStation();
String arrivalInput = view.requestArrivalStation();
Error error = isValidStations(departureInput, arrivalInput);
if (error != Error.OK) {
view.printError(error);
return;
}
List<String> path = findMinTimePath(departureInput, arrivalInput, view);
if (path == null) {
return;
}
view.printPath(path);
scene.back();
}

private static List<String> findMinTimePath(String departureInput, String arrivalInput,
View view) {
Station departureStation = StationRepository.getStationbyName(departureInput);
Station arrivalStation = StationRepository.getStationbyName(arrivalInput);
List<String> path = PathFinder.findMinTimePath(departureStation, arrivalStation);
if (path == null) {
view.printError(Error.STATION_NOT_CONNECTED);
}
return path;
}

private static Error isValidStations(String departureInput, String arrivalInput) {
if (departureInput.equals(arrivalInput)) {
return Error.SAME_STATIONS;
}
Station departureStation = StationRepository.getStationbyName(departureInput);
Station arrivalStation = StationRepository.getStationbyName(arrivalInput);
if ((departureStation == null) || (arrivalStation == null)) {
return Error.STATION_NOT_EXISTS;
}
return Error.OK;
}

public static void back(Scene scene, View view) {
scene.back();
}
}
20 changes: 20 additions & 0 deletions src/main/java/subway/controller/ViewController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package subway.controller;

import java.util.function.BiConsumer;
import subway.Scene;
import subway.view.View;

public abstract class ViewController {
protected View view;

public ViewController() {}

abstract public BiConsumer<Scene, View> selectMenu();

public void run(Scene scene) {
BiConsumer<Scene, View> action = selectMenu();
if (action != null) {
action.accept(scene, view);;
}
}
}
32 changes: 31 additions & 1 deletion src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package subway.domain;

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

public class Line {
private String name;
private List<Station> stations = new ArrayList<Station>();
private List<Integer> distances = new ArrayList<Integer>(); // 0번째와 1번째 station들의 관계는 0번째 인덱스에
// 존재한다.
private List<Integer> times = new ArrayList<Integer>();

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

// 추가 기능 구현
public List<Station> getStations() {
return Collections.unmodifiableList(stations);
}

public List<Integer> getDistances() {
return Collections.unmodifiableList(distances);
}

public List<Integer> getTimes() {
return Collections.unmodifiableList(times);
}

public void registerFirstStation(Station station) {
if (stations.isEmpty()) {
stations.add(station);
}
}

public void pushSections(Station station, int distance, int time) {
stations.add(station);
distances.add(distance);
times.add(time);
}
}
Loading