우테코 프리코스 2주차의 내용을 기록해보고자 한다.
✨ 과제 내용
과제 내용은 아래와 같다.
자동차 경주
: 초간단 자동차 경주 게임 구현
- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.
✨ 과제 입출력 요구 사항
- 입력
경주할 자동차 이름(이름은 쉼표(,) 기준으로 구분) - 출력
시도할 횟수
- 실행 결과 예시
경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 횟수는 몇 회인가요?
5
실행 결과
pobi : -
woni :
jun : -
pobi : --
woni : -
jun : --
pobi : ---
woni : --
jun : ---
pobi : ----
woni : ---
jun : ----
pobi : -----
woni : ----
jun : -----
최종 우승자 : pobi, jun
✨ 문제 풀이 과정
1. 큰 틀잡기
문제를 풀기 전에 구현할 기능별로 나눠 작성하였다.
class App {
async run() {
try {
// 사용자로부터 자동차 이름 입력 받기
// 사용자로부터 시도 횟수 입력 받기
// 자동차 데이터를 초기화 (각 자동차의 이름과 위치)
// 게임 진행
// 최종 우승자 발표
} catch (error) {
// 오류 발생 시 오류 메시지 출력
Console.print(`[ERROR] ${error.message}`);
}
}
}
2. 첫번째 난관
프로그래밍 요구사항2에 아래와 같이 적혀있었다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
그러나 이 내용을 못 보고 코드를 짜다가 뒤늦게 발견.. !S
그래서 아래와 같이 짰던 코드는 depth가 3을 넘어가기에 ..
// 게임을 진행하는 함수
playGame(carData, attemptCount) {
for (let i = 0; i < attemptCount; i++) {
carData.forEach((car) => {
if (Random.pickNumberInRange(0, 9) >= 4) {
car.position++;
}
});
this.printRoundResults(carData);
}
}
이렇게 수정했다 !
// 게임을 진행하는 함수
playGame(carData, attemptCount) {
for (let i = 0; i < attemptCount; i++) {
this.playRound(carData);
this.printRoundResults(carData);
}
}
// 라운드를 진행하는 함수
playRound(carData) {
carData.forEach((car) => this.updateCarPosition(car));
}
// 자동차 전진 여부 결정 후 업데이트 함수
updateCarPosition(car) {
if (Random.pickNumberInRange(0, 9) >= 4) {
car.position++;
}
}
// 라운드별 결과를 출력하는 함수
printRoundResults(carData) {
carData.forEach((car) => {
Console.print(`${car.name} : ${'-'.repeat(car.position)}`);
});
Console.print('');
}
이렇게 수정하는게 맞나 싶은 의문도 들지만, indent depth 가 3이 넘지 않기 위해서 작은 기능별로 함수를 구현하고자 했다. 물론 이렇게 분류할수록 재사용성의 면에서 코드 가용성이 더 올라갈 수 있다고 생각한다.
그러나 실제 현업에서 코드를 구현할때도 이렇게 indent depth까지 신경쓰며, 최대한 작은 기능별로 분리하여 구현할까? 하는 궁금증이 들었다.
3. 두번째 난관
저번주차와 마찬가지로 .. test 코드의 error throw관련해서 문제가 있었다.
app.js에서는 문제 없이 실행되지만, 테스트 코드에서는 app.js와 같이 실행하면 error throw하는 과정에서 문제가 생긴다. 그래서 나의 경우 저번주차와 마찬가지로 아래의 코드를 추가해서 test의 상황에서는 error를 한번더 throw하도록 코드를 작성했다.
catch (error) {
// 오류 발생 시 오류 메시지 출력
Console.print(`${error.message}`);
// 테스트에서 예외를 감지할 수 있도록 예외를 다시 던짐.
if (process.env.NODE_ENV === "test") {
throw error;
}
}
이 방식이 맞는 방식인지 의문이 들어서,,
다음주차 진행하는 동안 나의 코드를 리뷰 & 피드백 받아볼 계획이다.
✨ 최종 과제 제출
https://github.com/woowacourse-precourse/javascript-racingcar-7/pull/348
[자동차 경주] 안은소 미션 제출합니다. by eunsoA · Pull Request #348 · woowacourse-precourse/javascript-racingca
구현 기능 목록 사용자 입력 처리 경주할 자동차 이름과 시도 횟수를 사용자로부터 입력받는 기능을 구현했습니다. 자동차 이름은 쉼표로 구분하며, 최대 5자까지 입력할 수 있습니다. 자동차
github.com
## ✨ 구현 기능 목록
1. **사용자 입력 처리**
- 경주할 자동차 이름과 시도 횟수를 사용자로부터 입력받는 기능을 구현했습니다. 자동차 이름은 쉼표로 구분하며, 최대 5자까지 입력할 수 있습니다.
2. **자동차 전진 조건**
- 각 라운드에서 0부터 9까지의 랜덤 숫자를 생성하고, 숫자가 4 이상일 때만 해당 자동차가 전진하는 로직을 구현했습니다.
- 랜덤 숫자는 `@woowacourse/mission-utils`의 `Random.pickNumberInRange()`를 사용하여 생성했습니다.
3. **라운드별 결과 출력**
- 각 라운드가 끝날 때마다 모든 자동차의 위치를 출력합니다.
4. **우승자 결정 및 발표**
- 모든 라운드가 끝난 후, 가장 멀리 이동한 자동차를 우승자로 결정하고, 여러 우승자가 있을 경우 쉼표로 구분하여 출력하도록 했습니다.
5. **환경별 예외 처리**
- 테스트 환경(NODE_ENV=test)에서는 예외 발생 시 프로그램이 예외를 다시 던져 처리됩니다.
- 실제 실행 환경에서는 예외 발생 시 오류 메시지만 출력하고 프로그램이 종료됩니다.
## ✨ 예외 처리
1. **자동차 이름 입력 오류**
- 자동차 이름이 5자 이상이거나 빈 이름이 입력될 경우 `[ERROR] 자동차 이름은 1자 이상 5자 이하로 입력해주세요.`라는 메시지를 출력하고 애플리케이션을 종료합니다.
2. **경주 횟수 입력 오류**
- 입력된 경주 횟수가 숫자가 아니거나 0 이하일 경우 `[ERROR] 횟수는 1 이상의 숫자로 입력해주세요.`라는 메시지를 출력하고 애플리케이션을 종료합니다.
과제 후 소감
# 회고
1. 지원서에 작성한 목표를 얼마나 달성하고 있다고 생각하나요? 그 이유는 무엇인가요?
저는 목표를 70% 정도 달성하고 있다고 생각합니다. 프리 코스를 진행하면서 문제 해결 능력을 강화하기 위해 "어떻게? 왜?"라는 질문을 지속적으로 던지며 깊이 있는 사고를 하려고 노력했고, 이를 통해 제가 아는 것과 모르는 것을 구분할 수 있었습니다. 또한, 학습 계획을 체계적으로 관리하고 일 별, 주 별로 목표를 점검하면서 학습 루틴을 유지하려고 했습니다. 다만, 커뮤니티 내에서 코드 리뷰와 피드백을 적극적으로 활용하지 못한 점이 아쉬웠습니다. 이러한 부분은 앞으로 남은 2주차간 개선하여 더욱 성장하고 싶습니다.
2. 지원서에 작성한 목표를 변경해야 한다고 생각하시나요? 그렇다면 그 이유와 어떤 목표로 변경하고 싶으신가요?
목표의 큰 틀은 유지하되, 세부적인 부분에서 변경이 필요하다고 생각합니다. 특히 커뮤니티 내에서 코드 리뷰와 피드백을 더 적극적으로 활용하지 못한 부분이 아쉽습니다. 사실, 우아한테크코스를 진행하는 같은 학과 친구들과 서로의 코드 리뷰를 요청했으나, 시험기간으로 원활하게 이루어지지 못했습니다. 그래서 남은 2주차 동안은 우테코의 커뮤니티를 활용하여 다른 커뮤니티원들의 코드를 리뷰하고, 피드백을 통해 새로운 시각을 얻는 것을 목표로 추가하고 싶습니다. 이를 통해 더 깊이 있는 배움을 얻고, 함께 성장하는 경험을 더 많이 쌓고자 합니다.
3. 프리코스를 진행하면서 눈에 띄는 변화나 깨달은 점이 있나요?
가장 큰 변화는 문제 해결 과정을 체계적으로 정리하고, 이를 통해 성찰 할 수 있는 능력이 생겼다는 점입니다. 또한, 매주 학습한 내용을 블로그에 기록하면서 회고하는 과정이 제 학습을 더욱 확고하게 만들어주었고, 학습 내용을 오래 기억할 수 있도록 도와주었습니다. 또한 2주 간은 혼자 공부하는 범위가 컸다면 남은 2주차 동안은 혼자보다는 커뮤니티에서 협력하고 피드백을 주고받는 과정을 경험해보고 싶습니다.
# 2주차 과제 진행 소감
1-2주차가 학기 중간고사 기간과 겹치는 바람에 리뷰와 피드백에 시간을 쏟지 못한 것에 많은 아쉬움이 남습니다. 개인적인 블로그에 회고 및 코드에 관한 리뷰를 작성 중이지만 이것만으로는 개인적으로 부족하다는 생각이 듭니다. 우테코 과제의 장점은 모든 이들의 코드가 오픈소스라는 점 입니다. 다음 한주간 동안 저는 이점을 활용해서 다른 사람들의 코드를 보고 공부해볼 계획입니다. 또한, 학과 친구들, 우테코 커뮤니티를 사용해서 제 코드의 리뷰를 받아볼 생각입니다.
아무튼 제출 완료 !
'대외 활동 > 우아한테크코스' 카테고리의 다른 글
[회고] 레벨2 1주차 회고 (1) | 2025.05.03 |
---|---|
[우테코] 프리코스 3주차 (2) | 2025.01.26 |
[우테코] 프리코스 1주차 (0) | 2024.10.28 |