diff --git a/src/main/java/LadderSimulator.java b/src/main/java/LadderSimulator.java new file mode 100644 index 00000000..ddd3c088 --- /dev/null +++ b/src/main/java/LadderSimulator.java @@ -0,0 +1,74 @@ +import java.util.List; + +import model.Ladder; +import model.Person; +import util.InputParser; +import view.InputView; +import view.OutPutView; + +public class LadderSimulator { + + private Ladder ladder; + private int height; + private int width; + + public void start() { + processLadderInput(); + processLadderPersonMove(); + processLadderResult(); + } + + private void processLadderInput() { + List persons = InputParser.parsePersons(InputView.inputPersons()); + List results = InputParser.parseResults(InputView.inputResults()); + height = InputParser.parseLadderHeight(InputView.inputLadderHeight()); + width = persons.size() - 1; + + this.ladder = new Ladder(height, width, persons, results); + OutPutView.printLadder(ladder); + } + + private void processLadderPersonMove() { + for (Person person : ladder.getPersons()) { + PersonMovement(person); + } + } + + private void processLadderResult() { + while (true) { + String resultPersonName = InputView.inputResultPerson(); + + if (resultPersonName.equals("all")) { // all 입력시 모든 사람의 결과 출력 + OutPutView.printLadderResult(ladder); + return; + } + + Person resultPerson = ladder.getPersonByName(resultPersonName); + OutPutView.printPersonResult(resultPerson, ladder); + } + } + + // 우측우선이동임 + private void personMovement(Person person) { + for (int nowHeight = 0; nowHeight < height; nowHeight++) { + if (canMoveRight(person, ladder, nowHeight)) { + person.moveRight(); + continue; + } + + if (canMoveLeft(person, ladder, nowHeight)) { + person.moveLeft(); + continue; + } + } + } + + private boolean canMoveLeft(Person person, Ladder ladder, int nowHeight) { + return person.getPosition() > 0 && ladder.isPoint(nowHeight, person.getPosition() - 1); + } + + private boolean canMoveRight(Person person, Ladder ladder, int nowHeight) { + return person.getPosition() < width && ladder.isPoint(nowHeight, person.getPosition()); + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..6cd31e0b --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + LadderSimulator simulator = new LadderSimulator(); + simulator.start(); + } +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 00000000..ad007c61 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,46 @@ +package model; + +import java.util.List; +import java.util.stream.Stream; + +public class Ladder { + + private final List lines; + private List persons; + private List results; + + public Ladder(int height, int width, List persons, List results) { + this.lines = Stream.generate(() -> new Line(width)) + .limit(height) + .toList(); + this.persons = persons; + this.results = results; + } + + public List getLines() { + return lines; + } + + public List getPersons() { + return persons; + } + + public List getResults() { + return results; + } + + public boolean isPoint(int lineIndex, int pointIndex) { + if (lineIndex < 0 || lineIndex >= lines.size()) { + throw new IndexOutOfBoundsException("인덱스 범위 초과"); + } + return lines.get(lineIndex).isPoint(pointIndex); + } + + public Person getPersonByName(String name) { + return persons.stream() + .filter(person -> person.getName().equals(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당 이름의 사람이 없습니다: ")); + } + +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 00000000..bcf9e096 --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,36 @@ +package model; + +import java.util.List; + +import util.LadderRandomGenerator; + +public class Line { + + private final List points; + + public Line(int length) { + this.points = LadderRandomGenerator.generateRandomLine(length); + } + + public List getPoints() { + return points; + } + + public boolean isPoint(int index) { + if (index < 0 || index >= points.size()) { + throw new IndexOutOfBoundsException("인덱스 범위 초과"); + } + return points.get(index); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Boolean point : points) { + sb.append("|"); + sb.append(point ? "-----" : " "); + } + sb.append("|"); + return sb.toString(); + } +} diff --git a/src/main/java/model/Person.java b/src/main/java/model/Person.java new file mode 100644 index 00000000..508d27af --- /dev/null +++ b/src/main/java/model/Person.java @@ -0,0 +1,37 @@ +package model; + +import java.util.List; + +public class Person { + + private final String name; + private int position; + + public Person(String name, int position) { + this.name = name; + this.position = position; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public void moveLeft() { + position--; + } + + public void moveRight() { + position++; + } + + public static List fromNames(List names) { + return names.stream() + .map(name -> new Person(name, names.indexOf(name))) + .toList(); + + } +} diff --git a/src/main/java/util/InputParser.java b/src/main/java/util/InputParser.java new file mode 100644 index 00000000..75ef9116 --- /dev/null +++ b/src/main/java/util/InputParser.java @@ -0,0 +1,30 @@ +package util; + +import java.util.Arrays; +import java.util.List; + +import model.Person; + +public class InputParser { + + public static int parseLadderHeight(String input) { + LadderVaildator.validateLadderHeight(input); + return Integer.parseInt(input); + } + + public static int parseLadderWidth(String input) { + LadderVaildator.validateLadderWidth(input); + return Integer.parseInt(input); + } + + public static List parsePersons(String input) { + LadderVaildator.validatePersons(input); + String[] names = input.split(","); + return Person.fromNames(Arrays.asList(names)); + } + + public static List parseResults(String input) { + LadderVaildator.validateResults(input); + return Arrays.asList(input.split(",")); + } +} diff --git a/src/main/java/util/LadderRandomGenerator.java b/src/main/java/util/LadderRandomGenerator.java new file mode 100644 index 00000000..f468ef01 --- /dev/null +++ b/src/main/java/util/LadderRandomGenerator.java @@ -0,0 +1,18 @@ + +package util; + +import java.util.List; +import java.util.stream.Stream; + +public class LadderRandomGenerator { + + public static boolean generateRandomBoolean() { + return Math.random() < 0.5; + } + + public static List generateRandomLine(int length) { + return Stream.generate(LadderRandomGenerator::generateRandomBoolean) + .limit(length) + .toList(); + } +} diff --git a/src/main/java/util/LadderVaildator.java b/src/main/java/util/LadderVaildator.java new file mode 100644 index 00000000..c716e138 --- /dev/null +++ b/src/main/java/util/LadderVaildator.java @@ -0,0 +1,51 @@ + +package util; + +public class LadderVaildator { + + public static void validateLadderHeight(String height) { + if (height == null || height.isEmpty()) { + throw new IllegalArgumentException("사다리 높이는 비어있을 수 없습니다."); + } + + if (height.matches("\\D+")) { + throw new IllegalArgumentException("사다리 높이는 숫자로 입력해야 합니다."); + } + + int heightValue = Integer.parseInt(height); + + if (heightValue <= 0) { + throw new IllegalArgumentException("사다리 높이는 0보다 큰 숫자여야 합니다."); + } + + } + + public static void validateLadderWidth(String width) { + if (width == null || width.isEmpty()) { + throw new IllegalArgumentException("사다리 넓이는 비어있을 수 없습니다."); + } + + if (width.matches("\\D+")) { + throw new IllegalArgumentException("사다리 넓이는 숫자로 입력해야 합니다."); + } + + int widthValue = Integer.parseInt(width); + + if (widthValue <= 0) { + throw new IllegalArgumentException("사다리 넓이는 0보다 큰 숫자여야 합니다."); + } + + } + + public static void validatePersons(String persons) { + if (persons == null || persons.isEmpty()) { + throw new IllegalArgumentException("참여자 이름은 비어있을 수 없습니다."); + } + } + + public static void validateResults(String results) { + if (results == null || results.isEmpty()) { + throw new IllegalArgumentException("실행 결과는 비어있을 수 없습니다."); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..a075cdb5 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,29 @@ +package view; + +import java.util.Scanner; + +public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + public static String inputLadderHeight() { + System.out.print("사다리의 높이는 몇 개인가요?"); + return scanner.nextLine(); + } + + public static String inputPersons() { + System.out.print("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + return scanner.nextLine(); + } + + public static String inputResults() { + System.out.print("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + return scanner.nextLine(); + } + + public static String inputResultPerson() { + System.out.print("결과를 보고 싶은 사람은?"); + return scanner.nextLine(); + } + +} diff --git a/src/main/java/view/OutPutView.java b/src/main/java/view/OutPutView.java new file mode 100644 index 00000000..6013b005 --- /dev/null +++ b/src/main/java/view/OutPutView.java @@ -0,0 +1,37 @@ +package view; + +import java.util.List; + +import model.Ladder; +import model.Line; +import model.Person; + +public class OutPutView { + + public static void printLadder(Ladder ladder) { + List lines = ladder.getLines(); + System.out.println("사다리 결과"); + for (Person person : ladder.getPersons()) { + System.out.print(person.getName() + " "); + } + System.out.println(); + for (Line line : lines) { + System.out.println(line); + } + for (String result : ladder.getResults()) { + System.out.print(result + " "); + } + System.out.println(); + } + + public static void printLadderResult(Ladder ladder) { + System.out.println("실행 결과"); + for (Person person : ladder.getPersons()) { + System.out.println(person.getName() + " : " + ladder.getResults().get(person.getPosition())); + } + } + + public static void printPersonResult(Person person, Ladder ladder) { + System.out.println(ladder.getResults().get(person.getPosition())); + } +}