Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .idea/material_theme_project_new.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions src/main/java/DrawConfirm.java
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;
}


}
60 changes: 58 additions & 2 deletions src/main/java/Ladder.java
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");
}
Comment on lines +15 to +18
Copy link

Choose a reason for hiding this comment

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

confirm 메서드에 음수 검증이 따로 없는걸로 확인되는데 구현해주신 NaturalNumber 객체를 활용하여 drawLine 의 매개변수로 받으면 좋을 것 같아요.
지금은 매개변수로 -1 을 넣으면 예외가 발생합니다!


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;
}

}
18 changes: 18 additions & 0 deletions src/main/java/NaturalNumber.java
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;
}
}
87 changes: 87 additions & 0 deletions src/test/java/LadderTest.java
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));
}
}