Skip to content

๐Ÿš€ 3๋‹จ๊ณ„ - ์‚ฌ๋‹ค๋ฆฌ(๊ฒŒ์ž„ ์‹คํ–‰) #2392

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Apr 19, 2025
6 changes: 5 additions & 1 deletion src/main/java/nextstep/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ public class Main {

public static void main(String[] args) {
var players = InputView.inputPlayerNames();
var results = InputView.inputResults();
var height = InputView.inputHeight();

var ladder = new Ladder(players, height);
var report = ladder.report(results);

OutputView.printResult(ladder);
OutputView.printResult(ladder, results);
OutputView.searchResult(report);
}
}

17 changes: 17 additions & 0 deletions src/main/java/nextstep/ladder/Ladder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package nextstep.ladder;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Ladder {
private final Players players;
Expand All @@ -18,4 +20,19 @@ public Lines getLines() {
public Players getPlayers() {
return players;
}

public Map<String, String> calculateResults(List<String> results) {
Map<String, String> resultMap = new HashMap<>();
for (int i = 0; i < players.size(); i++) {
String playerName = players.getPlayersNames().get(i);
var cursor = i;
cursor = lines.calculateLastPosition(cursor);
resultMap.put(playerName, results.get(cursor));
}
return resultMap;
}

public Report report(List<String> results) {
return new Report(calculateResults(results));
}
}
48 changes: 42 additions & 6 deletions src/main/java/nextstep/ladder/Line.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,56 @@
package nextstep.ladder;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Line {
private final List<Boolean> points;

public Line(int playerCount, Random random) {
this.points = IntStream.range(1, playerCount)
.mapToObj(it -> random.nextBoolean())
.collect(Collectors.toUnmodifiableList());
Line(int playerCount, Random random) {
this.points = new ArrayList<>();

for (int i = 0; i < playerCount - 1; i++) {
if (i == 0) {
points.add(random.nextBoolean());
continue;
}

if (points.get(i - 1) == true) {
points.add(false);
continue;
}

points.add(random.nextBoolean());
}
}

Line(List<Boolean> points) {
this.points = points;
Comment on lines +28 to +29

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ ‘๊ทผ ์ œ์–ด์ž ์ ์ ˆํžˆ ๋ถ€์—ฌํ•ด์ฃผ์„ธ์š”.
์ œ ์ƒ๊ฐ์—๋Š” ์œ„์— public์œผ๋กœ ์ž‘์„ฑํ•˜์‹  ์ƒ์„ฑ์ž๋ฅผ builder๋‚˜ static of pattern์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์ด ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ๊ฐ€๋ฆฌ๋Š” ๊ฒƒ๋„ ์–‘ํ˜ธํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‘˜๋‹ค Lines์™€ test์ฝ”๋“œ์—์„œ๋งŒ ์ ‘๊ทผํ•˜๋‹ˆ๊นŒ default๋กœ ์„ ์–ธํ–ˆ๊ณ 

builder๋‚˜ static of๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด์ •๋„ ๋ถ„๋Ÿ‰์—๋Š” ์‚ฌ์šฉ์•ˆํ•˜๋Š” ์ฃผ์˜์—ฌ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ถ”ํ›„ ๋ณ€์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ๋กœ์ง์ด ๋Š˜์–ด๋‚˜๋ฉด ๋ฐ˜์˜์„ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

}

public List<Boolean> getPoints() {
return points;
}

public int calculateNextPosition(int cursor) {
if (cursor == 0 && points.get(cursor)) {
return ++cursor;
}

if (cursor == points.size() && points.get(cursor - 1)) {
return --cursor;
}

if (points.get(cursor - 1)) {
return --cursor;
}

if (points.get(cursor)) {
return ++cursor;
}

return cursor;

}
}
10 changes: 10 additions & 0 deletions src/main/java/nextstep/ladder/Lines.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,14 @@ public static Lines of(int height, int playerCount) {
public List<Line> getLines() {
return lines;
}

public int calculateLastPosition(int playerIndex) {
int cursor = playerIndex;

for (Line line : lines) {
cursor = line.calculateNextPosition(cursor);
}

return cursor;
}
}
4 changes: 4 additions & 0 deletions src/main/java/nextstep/ladder/Players.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ public List<String> getPlayersNames() {
.map(Player::getName)
.collect(Collectors.toList());
}

public int size() {
return players.size();
}
}
28 changes: 28 additions & 0 deletions src/main/java/nextstep/ladder/Report.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package nextstep.ladder;

import java.util.HashMap;
import java.util.Map;

public class Report {
private final Map<String, String> result;

public Report(Map<String, String> result) {
this.result = result;
}

public Map<String, String> getResult() {
return new HashMap<>(result);
}

public boolean containsName(String name) {
return result.containsKey(name);
}

public String findResultByName(String name) {
if (!result.containsKey(name)) {
throw new IllegalArgumentException("ํ•ด๋‹น ์ด๋ฆ„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
}

return result.get(name);
}
}
6 changes: 6 additions & 0 deletions src/main/java/nextstep/ui/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ public static List<String> inputPlayerNames() {
.collect(Collectors.toUnmodifiableList());
}

public static List<String> inputResults() {
System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. (๊ฒฐ๊ณผ๋Š” ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•˜์„ธ์š”)");
return Arrays.stream(scanner.nextLine().split(","))
.collect(Collectors.toUnmodifiableList());
}

public static int inputHeight() {
System.out.println("์ตœ๋Œ€ ์‚ฌ๋‹ค๋ฆฌ ๋†’์ด๋Š” ๋ช‡ ๊ฐœ์ธ๊ฐ€์š”?");
return scanner.nextInt();
Expand Down
32 changes: 31 additions & 1 deletion src/main/java/nextstep/ui/OutputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@
import nextstep.ladder.Ladder;
import nextstep.ladder.Lines;
import nextstep.ladder.Players;
import nextstep.ladder.Report;

import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class OutputView {

public static void printResult(Ladder ladder) {
public static void printResult(Ladder ladder, List<String> results) {
System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ");
printPlayer(ladder.getPlayers());
printLine(ladder.getLines());
printResults(results);
}

private static void printPlayer(Players players) {
Expand All @@ -27,4 +31,30 @@ private static void printLine(Lines lines) {
System.out.println(lineString);
});
}

private static void printResults(List<String> results) {
System.out.println(String.join(" ", results));
}

public static void searchResult(Report report) {
while (true) {
System.out.println("๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€? (์ข…๋ฃŒํ•˜๋ ค๋ฉด 'exit' ์ž…๋ ฅ)");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();

if (input.equalsIgnoreCase("exit")) {
break;
}

if ("all".equalsIgnoreCase(input)) {
System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ");
report.getResult().forEach((key, value) -> System.out.println(key + " : " + value));
} else if (report.containsName(input)) {
System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ");
System.out.println(report.findResultByName(input));
} else {
System.out.println("์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
}
}
}
}
82 changes: 73 additions & 9 deletions src/test/java/nextstep/ladder/LineTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,20 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Random;

import static org.assertj.core.api.Assertions.assertThat;

public class LineTest {

@Test
@DisplayName("์‚ฌ๋‹ค๋ฆฌ ๋ผ์ธ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ")
@DisplayName("์‚ฌ๋‹ค๋ฆฌ ๋ผ์ธ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ: ๊ธธ์ด ์–‘์ชฝ์— ์ƒ๊ธธ ์ˆ˜ ์—†๋‹ค.")
void createTest() {
var playerCount = 5;
var trueLine = new Line(playerCount, new TrueRandom());
var falseLine = new Line(playerCount, new FalseRandom());

Assertions.assertThat(trueLine.getPoints()).containsExactly(true, true, true, true);
Assertions.assertThat(falseLine.getPoints()).containsExactly(false, false, false, false);
Assertions.assertThat(trueLine.getPoints()).isEqualTo(List.of(true, false, true, false));
}

static class TrueRandom extends Random {
Expand All @@ -26,10 +27,73 @@ public boolean nextBoolean() {
}
}

static class FalseRandom extends Random {
@Override
public boolean nextBoolean() {
return false;
}
@Test
@DisplayName("cursor๊ฐ€ 0์ผ ๋•Œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™")
void calculateNextPosition_cursorAtStart_movesRight() {
// given
var points = List.of(true, false, false);
var line = new Line(points);

// when
int nextPosition = line.calculateNextPosition(0);

// then
assertThat(nextPosition).isEqualTo(1);
}

@Test
@DisplayName("cursor๊ฐ€ ๋งˆ์ง€๋ง‰ ์œ„์น˜์ผ ๋•Œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™")
void calculateNextPosition_cursorAtEnd_movesLeft() {
// given
var points = List.of(false, false, true);
var line = new Line(points);

// when
int nextPosition = line.calculateNextPosition(2);

// then
assertThat(nextPosition).isEqualTo(1);
}

@Test
@DisplayName("cursor๊ฐ€ ์ค‘๊ฐ„์— ์žˆ์„ ๋•Œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™")
void calculateNextPosition_cursorInMiddle_movesLeft() {
// given
var points = List.of(false, true, false);
var line = new Line(points);

// when
int nextPosition = line.calculateNextPosition(2);

// then
assertThat(nextPosition).isEqualTo(1);
}

@Test
@DisplayName("cursor๊ฐ€ ์ค‘๊ฐ„์— ์žˆ์„ ๋•Œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™")
void calculateNextPosition_cursorInMiddle_movesRight() {
// given
var points = List.of(false, false, true);
var line = new Line(points);

// when
int nextPosition = line.calculateNextPosition(1);

// then
assertThat(nextPosition).isEqualTo(2);
}

@Test
@DisplayName("cursor๊ฐ€ ์ด๋™ํ•˜์ง€ ์•Š์Œ")
void calculateNextPosition_cursorDoesNotMove() {
// given
var points = List.of(false, false, false);
var line = new Line(points);

// when
int nextPosition = line.calculateNextPosition(1);

// then
assertThat(nextPosition).isEqualTo(1);
}
}
4 changes: 3 additions & 1 deletion src/test/java/nextstep/ladder/LinesTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package nextstep.ladder;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

Expand All @@ -14,6 +15,7 @@ void createTest() {
@Test
@DisplayName("lines ์ƒ์„ฑํ• ๋•Œ 1๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ")
void createExceptionTest() {
Lines.of(0,3);
Assertions.assertThatThrownBy(() -> Lines.of(0, 3))
.isInstanceOf(IllegalArgumentException.class).hasMessage("๋†’์ด๋Š” 1 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
}
}