diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 00000000..2b63946d
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index cc0a8fd0..33142a93 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,17 +4,7 @@
-
-
-
-
-
-
-
-
-
-
-
+
@@ -25,6 +15,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -37,31 +51,144 @@
- {
+ "keyToString": {
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "last_opened_file_path": "/Users/he2joo/be-java-ladder-max",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "inlay.hints",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ true
+ false
+
-
+
+
+
+
+
@@ -74,10 +201,58 @@
1672210428730
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/kr/codesquad/domain/Players.java
+ 51
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index ad6e6861..184e8f51 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,51 @@
-# Java Lotto
+# 사다리 게임
+### step1. 기본기능 구현하기
+제약사항
+1. 메서드 길이 10줄 넘어가지 않게 구현하기!
-- Last Update: 2022-12-28
+시도방법
+1. 객체지향 생각하지 않고 그냥 기본 기능만 구현.
+2. 메서드를 입력, 사다리 만들기, 출력 세 가지로 나눠서 메서드 길이 10줄 넘어가지 않게 구현했다.
-## 코드 리뷰
+### step2. 리팩토링 맛보기
+추가사항
+1. 메서드가 한 가지 일만 하도록 최대한 작게 만들기
+2. 들여쓰기를 1단계로 줄이기
+3. else문 사용하지 않기
-* [텍스트와 이미지로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://github.com/code-squad/codesquad-docs/blob/master/codereview/README.md)
+시도방법
+1. 사다리 만드는 메서드를 사다리 기본틀 만드는 makeBasic()과 랜덤으로 사다리 변경하는 makeLadder() 나눴다.
+2. 스트림을 이용해 for문을 한 번만 사용했다.
+ makeBasic()메서드에서 IntStream -> mapToObj()로 짝수는 '|' 홀수는 '-'로 변경했다.
+ makeLadder()메서드에 makeBasic()호출 뒤 스트림 이용해 '-'을 랜덤으로 ' '으로 변경했다.
+ 두 메서드 모두 스트림을 Character[][]로 변환시켰는데 스트림의 toArray()메서드가 기본형 변수로 변환이 안되서 어쩔 수 없이 래퍼클래스로 반환했다.
+3. printLadder()에서 Character[] -> toString() -> replaceAll() 과정으로 쉼표와 대괄호를 제외하고 출력되게 했다.
-* [동영상으로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://youtube.com/watch?v=lFinZfu3QO0&si=EnSIkaIECMiOmarE)
+추가로 고민해 볼 사항 : 2차원 배열을 스트림으로 사용하기(단, 생성자에 한번에 넣어서)
+
+### step3. 사다리 모양 개선
+추가사항
+1. 플레이어의 이름을 추가한다.(최대 5글자까지)
+2. 사다리의 라인이 겹치지 않도록 바꾼다.
+3. 배열 대신 ArrayList와 Generic을 활용한다.
+4. 들여쓰기 1단계로 제한한다.
+
+시도방법
+1. 기존의 메서드 최대한 활용했다. 일시적으로 char배열을 -> String배열로 바꿨다. '-' -> "-----"
+2. 사다리 틀 만들기 -> 사다리 랜덤 -> 사다리 검사하기. 사다리 선이 연속적으로 나오지 않게 검사하는 단계를 추가했다.
+3. player 이름을 일정한 간격으로 출력하기 위해 맨앞, 중간, 맨 뒤 세 부분으로 나눠 메서드를 작정했다.
+4. 배열 -> ArryayList로 바꾸기
+
+추가로 고민해 볼 사항 : checkLadder()에서 .forEach(i -> array[i] = " ");를 i번째가 아니라 랜덤으로 바꿀 수 있는지
+
+### step4. 리팩토링2
+추가사항
+1. ArrayList> -> ArrayList
+2. 단위테스트 추가
+3. 역할에 맞게 패키지 분리하기
+
+### step5. 실행결과 출력
+추가사항
+1. 사다리 게임 결과를 계산한다.
+2. 사다리 실행 결과를 출력한다. (all -> 전체 결과 출력, 이름 -> 해당 플레이어 결과 출력)
+3. 사다리 높이, 플레이어 이름에 대한 유효성 검사를 추가한다.
\ No newline at end of file
diff --git a/src/main/java/kr/codesquad/Main.java b/src/main/java/kr/codesquad/Main.java
index b5ec785b..240bd3a6 100644
--- a/src/main/java/kr/codesquad/Main.java
+++ b/src/main/java/kr/codesquad/Main.java
@@ -1,7 +1,10 @@
package kr.codesquad;
+import kr.codesquad.view.Client;
+
public class Main {
public static void main(String[] args) {
- System.out.println("Hello world!");
+ Client client = new Client();
+ client.startGame();
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/kr/codesquad/domain/Ladder.java b/src/main/java/kr/codesquad/domain/Ladder.java
new file mode 100644
index 00000000..33ed8228
--- /dev/null
+++ b/src/main/java/kr/codesquad/domain/Ladder.java
@@ -0,0 +1,42 @@
+package kr.codesquad.domain;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class Ladder {
+ private int row;
+ private int column;
+ private ArrayList ladder;
+
+ public Ladder(int row, int headCount){
+ this.row = row;
+ this.column = headCount*2-1;
+ this.ladder = new ArrayList<>();
+ }
+
+ public String make(){
+ for (int i=0;ii/2);
+ for (Line line : ladder){
+ int[] move = line.move();
+ for (int i=0;i playersList = Arrays.asList(list.split(","));
+ Ladder ladder = new Ladder(row,playersList.size());
+ String ladderShape = ladder.make();
+ this.players = new Players(playersList,resultList,ladder.calculateResult());
+ printAll(players,ladderShape);
+ }
+ public void searchResult(String id) {
+ if ("춘식이".equals(id)){
+ System.out.println("게임을 종료합니다.");
+ throw new IllegalArgumentException();
+ }
+ System.out.println(players.searchResult(id));
+ }
+ private void printAll(Players players, String ladder){ // 플레이어 이름, 사다리 모양, 결과
+ System.out.println(players.getNames());
+ System.out.println(ladder);
+ System.out.println(players.getResultList());
+ }
+}
diff --git a/src/main/java/kr/codesquad/domain/Line.java b/src/main/java/kr/codesquad/domain/Line.java
new file mode 100644
index 00000000..4e542eca
--- /dev/null
+++ b/src/main/java/kr/codesquad/domain/Line.java
@@ -0,0 +1,57 @@
+package kr.codesquad.domain;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class Line {
+ private List line;
+ private int column;
+ public Line(int column){
+ makeLine(column);
+ this.column = column;
+ }
+ public int[] move(){ // [1,0,-1,0,1,0,-1]
+ int[] move = new int[column];
+ Arrays.fill(move,0);
+ for (int i=1;i i%2==0 ? "|":" ")
+ .collect(Collectors.toCollection(ArrayList::new));
+ }
+ @Override
+ public String toString(){
+ StringBuilder sb = new StringBuilder();
+ for (String bar : line){
+ sb.append(bar);
+ }
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/kr/codesquad/domain/Players.java b/src/main/java/kr/codesquad/domain/Players.java
new file mode 100644
index 00000000..a9a96382
--- /dev/null
+++ b/src/main/java/kr/codesquad/domain/Players.java
@@ -0,0 +1,61 @@
+package kr.codesquad.domain;
+
+import java.util.*;
+
+public class Players {
+ private List players;
+ private HashMap result;
+ private List resultList;
+ public Players(List playersList,String resultList, int[] result){
+ this.players = playersList;
+ this.resultList = Arrays.asList(resultList.split(","));
+ this.result = new HashMap<>();
+ trim(players);
+ trim(this.resultList);
+ sortResult(result);
+ }
+
+ public String getNames(){
+ StringBuilder sb = new StringBuilder();
+ for (String name : players){
+ sb.append(String.format("%-6s", name)); // 각 이름당 주어진 자리는 6자리
+ }
+ return sb.toString();
+ }
+ public String getResultList(){ // 결과를 사다리 간격에 맞게 반환
+ StringBuilder sb = new StringBuilder();
+ for (String s : resultList){
+ sb.append(String.format("%-6s",s));
+ }
+ return sb.toString();
+ }
+ public String searchResult(String id) {
+ if ("all".equals(id)){
+ return getAllResult();
+ }
+ return getOneResult(id);
+ }
+ private String getAllResult(){
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry entry : result.entrySet()){
+ sb.append(entry.getKey()).append(" : ").append(entry.getValue()).append("\n");
+ }
+ return sb.toString();
+ }
+ private String getOneResult(String id){
+ String value = result.get(id);
+ return id +" : "+value;
+ }
+ private void sortResult(int[] tmp){
+ for (int i=0;i list){
+ for(int i=0; i list = new ArrayList<>();
+ list.add("pobi");
+ list.add("honux");
+ list.add("crong");
+ list.add("jk");
+ int[] result = {3,0,1,0,0,0,2};
+
+ Players players = new Players(list,"꽝,5000,꽝,3000",result);
+ String ans1 = players.searchResult("pobi");
+ String ans2 = players.searchResult("honux");
+ String ans3 = players.searchResult("crong");
+ String ans4 = players.searchResult("jk");
+ assertEquals("pobi : 3000",ans1);
+ assertEquals("honux : 5000",ans2);
+ assertEquals("crong : 꽝",ans3);
+ assertEquals("jk : 꽝",ans4);
+
+ }
+}
diff --git "a/\355\225\231\354\212\265\352\263\204\355\232\215.md" "b/\355\225\231\354\212\265\352\263\204\355\232\215.md"
new file mode 100644
index 00000000..3ed95488
--- /dev/null
+++ "b/\355\225\231\354\212\265\352\263\204\355\232\215.md"
@@ -0,0 +1,27 @@
+# 학습계획 (3/13 ~)
+## 이번주 학습 키워드
+- [x] TDD
+- [x] JUnit
+- [ ] Assertion
+- [ ] 일급컬렉션
+- [ ] 매직넘버
+- [ ] softAssertion
+- [ ] mock 객체
+
+### 3/13(월)
+- [x] 테스트 코드 예제 작성해보면서 이해하기
+- [x] 자바 복습하기
+- [x] [오브젝트] ch.5 읽기
+- [x] 리트코드 풀기
+- [x] 파이썬 복습하기
+
+#### 1. JUnit5 어노테이션
+
+____
+### 3/14(화)
+- [ ] 자바 복습하기
+- [ ] step4 설계 및 구현
+- [ ] [오브젝트] ch.6 읽기
+- [ ] 리트코드 풀기
+- [ ] 파이썬 복습하기
+____
\ No newline at end of file