다리 건너기
## ✏ 구현 기능 목록
### 1. 다리의 길이를 숫자로 입력받아 해당 길이만큼의 리스트 두 개를 생성한다.
- 플레이어에게 다리 길이를 입력받아 int 형식으로 변환한다.
- **예외: 다리 길이가 숫자가 아니거나, 숫자이지만 3부터 20 사이의 숫자가 아닐 때: IllegalArgumentException 발생 후 "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다." 출력.
- 예외 발생 시 에러 메시지 출력하고 다시 입력받는다.
- 위 칸 리스트: upBridge
- 아래 칸 리스트: downBridge
### 2. 위 칸과 아래 칸 중 건널 수 있는 칸을 저장할 리스트를 생성하며 값을 저장한다.
- 건널 수 있는 칸을 저장할 리스트: canCrossSquare- BridgeRandomNumberGenerator 클래스를 이용하여 다리 길이만큼 반복하여 0과 1 중 임의의 값을 정해 canCrossSquare에 저장한다.
- - 0인 경우: 아래 칸을 건널 수 있음 - canCrossSquare 에 "D" 저장
- - 1인 경우: 위 칸을 건널 수 있음. - canCrossSquare 에 "U" 저장
### 3. 플레이어가 이동할 칸을 입력받는다.
- 입력: 위 칸 - "U" / 아래 칸 - "D" 를 입력받는다.
- **예외: 입력한 값이 U나 B가 아닐 때: IllegalArgumentException 발생 후 "[ERROR] 위: U, 아래: D 값을 입력해 주세요." 출력.
- 예외 발생 시 에러 메시지 출력하고 다시 입력받는다.
- 플레이어의 입력값과 canCrossSquare 값을 비교하여(순서, 값 모두 고려) 다리 리스트에 값을 저장한다.
- - 사용자가 "U"를 입력한 경우: 이동할 수 있는 칸이면 upBridge에 " O " 저장 + donwBridge에 " " 저장 / 아니라면 upBridge에 " X " 저장 + donwBridge에 " " 저장 + 재시작/종료 여부 입력 받기
- - 사용자가 "D"를 입력한 경우: 이동할 수 있는 칸이면 donwBridge에 " O " 저장 + upBridge에 " " 저장 / 아니라면 donwBridge에 " X " 저장 + upBridge에 " " 저장 + 재시작/종료 여부 입력 받기
### 4. 플레이어가 입력한 값의 결과를 출력한다.
- upBridge와 downBridge를 행을 맞추어 출력한다.
- 처음 시작에는 "[", 끝에는 "]"를 붙여서 출력한다.
- 값과 값 사이에는 "|" 를 출력한다.
### 5. 재시작/종료 여부를 입력 받는다.
- 3번 과정에서 재시작/종료 여부 입력이 필요한 경우, 재시도: R / 종료: Q로 값을 입력받는다.
- - **예외: 입력한 값이 R이나 Q가 아닐 때: IllegalArgumentException 발생 후 "[ERROR] 재시도: R, 종료: Q 값을 입력해 주세요." 출력.
- - 예외 발생 시 에러 메시지 출력하고 다시 입력받는다.
- R을 입력 받았을 경우: upBride와 downBridge를 초기화하고 3번 과정부터 다시 시작한다.
-Q를 입력 받았을 경우: 최종 게임 결과 출력
### 6. 최종 게임 결과 출력
- 다리를 무사히 건넜거나, Q를 입력했을 경우 최종 게임 결과를 출력 후 게임을 종료한다.
- 최종 게임 결과: 게임 성공 여부, 총 시도한 횟수
지난 주 미션에서 error 메시지를 출력하는 기능을 완벽하게 구현하지 못했다. 이번에도 역시 error 메시지를 출력해야 해서 그 부분을 개선하는 데 중점을 뒀다. 이번에는 출력 후 종료하는 것이 아니라 다시 입력을 받는 것이라 조금 더 수월하긴 했다. error 메시지를 출력할 경우가 여러 개 있었는데, 지난 주에 이어 이번 주도 반복해서 하게 되니 조금 더 가독성을 높일 수 있었다.
이번 주에서 가장 어려웠던 부분은 최종 결과를 출력하는 부분이었다. <재시도>를 선택할 경우 다시 진행하도록 재귀를 이용하였더니 결과를 출력할 때 결과도 여러 차례 출력되었다. 처음에는 재귀 부분을 그대로 두고 방법을 찾아보았으나, 해결이 되지 않아 다른 방향으로 변경하였다. while문을 이용하여 무한반복을 하도록 한 후, break문으로 <나가기>를 선택할 경우 빠져나가도록 수정했다. while문 안에 for문 메서드를 넣다보니 break를 for문과 while문 모두에 넣어주는 것을 놓쳐 어려움이 있었다. <나가기>를 선택할 경우 while문을 빠져나와 종료할 조건은 넣었으나, <재시도>를 선택 후 성공할 경우 다 끝나고 빠져나오는 부분을 해결하기가 어려웠다. 리스트의 길이를 조건으로 하여 break를 해야 한다는 것까지는 알았으나, 이중 반복문에서 어떤 부분에 조건을 넣어야 할지를 찾는 것이 오래 걸렸다. 마침내 void 메서드를 수정하여 반환값을 활용하여 해결할 수 있었다!! 뿌듯.
지난 주 미션에서 가장 마지막에 test를 실행하여 오류가 났을 때 수정하기 어려웠던 점 역시 개선이 필요했다. 이번 미션에서는 테스트 코드를 먼저 보고 미션을 시작했다. 가이드라인을 정할 수 있어 시작이 더 수월했다. 전체적인 틀을 잡을 수 있었다! 또한 중간중간 build test를 실행하여 실행이 안 될 경우 바로바로 수정했다. 그 결과 이번에는 작동은 되지만 test를 통과하지 못하는 불상사가 생기지 않았다. failed 자체가 거의 없었다!
끝나지 않을 것 같았던 한 달이 지나고 어느덧 프리코스의 마지막 미션을 제출했다. 자바가 익숙하지 않은 상태에서 미션을 완성하려니 너무 어렵고 힘들었다. 그러나 자바의 문법을 잘 알지 못한 채로 요구사항만을 보고 ‘이렇게 구현해야겠다.’고 계획한 후, 해당 계획에 딱 맞는 메서드를 찾았을 때의 그 기분이 좋아서 포기할 수 없었던 것 같다. 포기하지 않고 마지막 미션을 제출할 수 있어서 뿌듯하다. 최종 코테를 보더라도 시간 안에 구현할 자신은 없어서 최종 합격에 대한 기대는 이미 접었다. 좋은 경험으로 남기는 걸로 ㅎㅎ
'IT 인사이트' 카테고리의 다른 글
[우아한테크코스 5기] 프리코스 3주차 미션 회고 (0) | 2022.11.16 |
---|---|
[우아한테크코스 5기] 프리코스 2주차 미션 회고 (0) | 2022.11.09 |
[우아한테크코스 5기] 프리코스 1주차 미션 회고 (0) | 2022.11.02 |
KMF & KME 2022(K-Metaverse Festival & K-Metaverse Expo) 메타버스 박람회 방문기 (1) | 2022.10.17 |
2022 메타버스 코리아 박람회 방문기(KES 2022) (1) | 2022.10.08 |