-
Notifications
You must be signed in to change notification settings - Fork 26
1주차 미션 / 서버 4조 조규빈 #22
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| public class DrawConfirm { | ||
|
|
||
| private final int[][] rows; | ||
| private final int row; | ||
| private final int numberOfPerson; | ||
|
|
||
| public DrawConfirm(int[][] rows, int row, int numberOfPerson) { | ||
| this.rows = rows; | ||
| this.row = row; | ||
| this.numberOfPerson = numberOfPerson; | ||
| } | ||
|
|
||
| public boolean confirm(int row, int column){ | ||
| //선을 그리는 범위가 벗어나는 것을 방지 | ||
| if (row >= this.row || column >= this.numberOfPerson - 1) { | ||
| return false; | ||
| } | ||
|
|
||
| //선을 그리려는 곳에 이미 선이 있는 상황을 방지 | ||
| if (this.rows[row][column] == 1) { | ||
| return false; | ||
| } | ||
|
|
||
| //연속가로선 방지 | ||
| if (column > 0 && rows[row][column - 1] == 1) { | ||
| return false; | ||
| } | ||
| //연속 가로선 방지 | ||
| if (column < this.numberOfPerson - 2 && rows[row][column + 1] == 1) { | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
|
|
||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,64 @@ | ||
| public class Ladder { | ||
|
|
||
| private final int[][] rows; | ||
| private final int numberOfPerson; | ||
| private final DrawConfirm drawConfirm; | ||
|
|
||
| public Ladder(int row, int numberOfPerson) { | ||
| rows = new int[row][numberOfPerson]; | ||
| //NaturalNumber를 사용해서 0이상의 값이 입력되도록 설정 | ||
| public Ladder(NaturalNumber row, NaturalNumber numberOfPerson) { | ||
| this.numberOfPerson = numberOfPerson.getNaturalNumber(); | ||
| rows = new int[row.getNaturalNumber()][numberOfPerson.getNaturalNumber() - 1]; | ||
|
|
||
| this.drawConfirm = new DrawConfirm(rows, row.getNaturalNumber(), numberOfPerson.getNaturalNumber()); | ||
| } | ||
|
|
||
| public void drawLine(int row, int position) { | ||
| if (!this.drawConfirm.confirm(row, position)) { | ||
| throw new IllegalArgumentException("Cannot Draw Line"); | ||
| } | ||
|
|
||
| rows[row][position] = 1; | ||
| } | ||
|
|
||
| /*private void drawLine(int position) { | ||
| boolean prevLine = false; | ||
|
|
||
| for (int i = 0; i < numberOfPerson - 1; i++) { | ||
| if (!prevLine && (Math.random() < 0.5 || i == numberOfPerson - 2)) { | ||
| rows[position][i] = 1; | ||
| prevLine = true; | ||
| } else { | ||
| rows[position][i] = 0; | ||
| prevLine = false; | ||
| } | ||
| } | ||
| }*/ | ||
|
|
||
| public int run(int startPosition) { | ||
| StartPositionConfirm(startPosition); | ||
| int currentPosition = startPosition - 1; | ||
|
|
||
| for (int[] row : rows) { | ||
| currentPosition = movePosition(currentPosition, row); | ||
| } | ||
|
|
||
| return currentPosition + 1; | ||
| } | ||
|
|
||
| private void StartPositionConfirm(int startPosition) { | ||
| if (startPosition < 1 || startPosition > numberOfPerson) { | ||
| throw new IllegalArgumentException("Invalid start position"); | ||
| } | ||
| } | ||
|
|
||
| private int movePosition(int currentPosition, int[] row) { | ||
| if (currentPosition > 0 && row[currentPosition - 1] == 1) { | ||
| return currentPosition - 1; | ||
| } | ||
| if (currentPosition < numberOfPerson - 1 && row[currentPosition] == 1) { | ||
| return currentPosition + 1; | ||
| } | ||
| return currentPosition; | ||
| } | ||
|
|
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| public class NaturalNumber { | ||
| private int naturalNumber; | ||
|
|
||
| private NaturalNumber(int naturalNumber) { | ||
| if (naturalNumber < 1) { | ||
| throw new IllegalArgumentException("Invalid number"); | ||
| } | ||
| this.naturalNumber = naturalNumber; | ||
| } | ||
|
|
||
| public static NaturalNumber from(int i) { | ||
| return new NaturalNumber(i); | ||
| } | ||
|
|
||
| public int getNaturalNumber() { | ||
| return naturalNumber; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,92 @@ | ||
| import org.junit.jupiter.api.Test; | ||
| import static org.junit.jupiter.api.Assertions.*; | ||
|
|
||
| class LadderTest { | ||
|
|
||
| @Test | ||
| void 사다리객체_테스트() { | ||
| // 사다리 객체가 정상적으로 생성되는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| assertNotNull(ladder); | ||
| } | ||
|
|
||
| @Test | ||
| void testDrawLine() { | ||
| // 선을 정상적으로 그릴 수 있는지, 같은 위치에 중복으로 선을 그릴 수 없는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| assertDoesNotThrow(() -> ladder.drawLine(0, 0)); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.drawLine(0, 0)); | ||
| } | ||
|
|
||
| @Test | ||
| void testDrawLine_OutOfBounds() { | ||
| // 사다리의 범위를 벗어나는 위치에 선을 그리려 할 때 예외가 발생하는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.drawLine(5, 0)); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.drawLine(0, 3)); | ||
| } | ||
|
|
||
| @Test | ||
| void 간단한_사다리테스트() { | ||
| // 사다리 게임을 실행했을 때 예상한 결과가 나오는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| ladder.drawLine(0, 0); | ||
| ladder.drawLine(1, 1); | ||
| ladder.drawLine(2, 2); | ||
|
|
||
| assertEquals(4, ladder.run(1)); | ||
| assertEquals(1, ladder.run(2)); | ||
| assertEquals(2, ladder.run(3)); | ||
| assertEquals(3, ladder.run(4)); | ||
| } | ||
|
|
||
| @Test | ||
| void 복잡한_사다리테스트() { | ||
| //더 복잡한 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(6)); | ||
| ladder.drawLine(0, 0); | ||
| ladder.drawLine(0, 2); | ||
| ladder.drawLine(0, 4); | ||
| ladder.drawLine(1, 1); | ||
| ladder.drawLine(1, 3); | ||
| ladder.drawLine(2, 0); | ||
| ladder.drawLine(2, 2); | ||
| ladder.drawLine(2, 4); | ||
| ladder.drawLine(3, 1); | ||
| ladder.drawLine(3, 3); | ||
| ladder.drawLine(4, 0); | ||
| ladder.drawLine(4, 2); | ||
| ladder.drawLine(4, 4); | ||
|
|
||
| assertEquals(6, ladder.run(1)); | ||
| assertEquals(4, ladder.run(2)); | ||
| assertEquals(5, ladder.run(3)); | ||
| assertEquals(2, ladder.run(4)); | ||
| assertEquals(3, ladder.run(5)); | ||
| assertEquals(1, ladder.run(6)); | ||
| } | ||
|
|
||
| @Test | ||
| void 시작_위치_테스트() { | ||
| // 유효하지 않은 시작 위치로 게임을 실행하려 할 때 예외가 발생하는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.run(0)); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.run(5)); | ||
| } | ||
|
|
||
| @Test | ||
| void 가로선_연속_테스트() { | ||
| // 연속된 가로선을 그리려 할 때 예외가 발생하는지 테스트 | ||
| Ladder ladder = new Ladder(NaturalNumber.from(5), NaturalNumber.from(4)); | ||
| ladder.drawLine(0, 0); | ||
| assertThrows(IllegalArgumentException.class, () -> ladder.drawLine(0, 1)); | ||
| } | ||
|
|
||
| @Test | ||
| void testNaturalNumber() { | ||
| // NaturalNumber 클래스가 올바르게 동작하는지 테스트 | ||
| assertDoesNotThrow(() -> NaturalNumber.from(1)); | ||
| assertThrows(IllegalArgumentException.class, () -> NaturalNumber.from(0)); | ||
| assertThrows(IllegalArgumentException.class, () -> NaturalNumber.from(-1)); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
confirm 메서드에 음수 검증이 따로 없는걸로 확인되는데 구현해주신
NaturalNumber객체를 활용하여 drawLine 의 매개변수로 받으면 좋을 것 같아요.지금은 매개변수로 -1 을 넣으면 예외가 발생합니다!