본문 바로가기
대외 활동/우아한테크코스

[우테코] 프리코스 3주차

by eunsoa 2025. 1. 26.

우테코 프리코스 3주차의 내용을 기록해보고자 한다.

 


 

 

 

✨ 과제 내용

과제 내용은 아래와 같다.


자동차 경주

: 초간단 자동차 경주 게임 구현

  • 주어진 횟수 동안 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. 첫번째 난관

 

import { Console } from "@woowacourse/mission-utils";

이것과 import Console from "@woowacourse/mission-utils"; 이거

두개의 차이가 뭐야?

 

 

 

 

 

3. 두번째 난관

 

 

async getPurchaseAmount() {
    return new Promise((resolve, reject) => {
      Console.readLineAsync("구입금액을 입력해 주세요.\n", (input) => {
        const amount = parseInt(input, 10);
        // 구입 금액이 1,000원 단위인지 확인
        if (isNaN(amount) || amount % 1000 !== 0) {
          reject(new Error("[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다."));
        } else {
          resolve(amount);
        }
      });
    });
  }

 

이걸로 수정함

 

async getPurchaseAmount() {
    const input = await Console.readLineAsync("구입금액을 입력해 주세요.\n");
    const amount = parseInt(input, 10);
    // 구입 금액이 1,000원 단위인지 확인
    if (isNaN(amount) || amount % 1000 !== 0) {
      throw new Error("[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다.");
    }
    return amount;
  }

 



3. 네번째 난관

 

 

 

 

 

✨ 최종 과제 제출

https://github.com/woowacourse-precourse/javascript-lotto-7/pull/333

 

[로또] 안은소 미션 제출합니다. by eunsoA · Pull Request #333 · woowacourse-precourse/javascript-lotto-7

작업 내용 🧑‍💻 로또 게임 구현을 위한 기본 기능들을 구현했습니다. 로또 번호 생성 및 검증을 위한 Lotto 클래스 구현 로또 번호의 유효성을 확인합니다. (총 6개, 1~45 사이의 중복되지 않는

github.com

 

## 작업 내용 :technologist:

> 로또 게임 구현을 위한 기본 기능들을 구현했습니다.

- 로또 번호 생성 및 검증을 위한 `Lotto` 클래스 구현
   - 로또 번호의 유효성을 확인합니다. (총 6개, 1~45 사이의 중복되지 않는 숫자)
   - 당첨 번호와 로또 티켓 번호의 일치 개수를 계산하는 기능을 포함합니다.
   - 특정 번호가 로또 번호에 포함되어 있는지 확인할 수 있는 메서드를 제공합니다.

- 당첨 결과 계산을 위한 `LottoResultCalculator` 클래스 구현
   - 사용자가 구매한 로또 티켓들과 당첨 번호, 보너스 번호를 입력으로 받아 당첨 결과를 계산합니다.
   - 일치 개수에 따라 3등부터 1등까지의 당첨 개수를 계산하고 결과를 반환합니다.


- 결과 출력을 담당하는 `ResultPrinter` 클래스 구현
   - 당첨 통계를 출력합니다.
   - 총 수익률을 계산하고 출력합니다.

- 전체 게임 로직을 관리하는 `App` 클래스 구현
   - 게임 시작부터 종료까지 전체 로직을 관리합니다.
   - 구매 금액을 입력받아 로또 티켓을 생성하고, 당첨 번호와 보너스 번호를 입력받습니다.
   - 결과를 계산한 후 최종 당첨 통계를 출력합니다.


## 알게된 점 :rocket:

> 이 작업을 통해 새롭게 알게 된 점이나 공유할 기술적인 인사이트를 작성합니다.

- 자바스크립트의 private 필드(`#`) 문법을 활용하여 캡슐화를 구현하는 방법을 학습했습니다.
- Jest를 활용한 단위 테스트 작성 방법과 테스트 케이스 설계 방법을 익혔습니다.
- MVC 패턴을 적용하여 각 클래스의 책임을 명확히 분리하는 방법을 실습했습니다.
- 예외 처리를 통한 견고한 프로그램 작성 방법을 학습했습니다.

## 리뷰 요구사항 :speech_balloon:

> 리뷰어가 특별히 집중해서 봐주었으면 하는 부분이나 검토해야 할 사항에 관한 내용을 적었습니다.

- `LottoResultCalculator` 클래스의 결과 계산 로직이 효율적인지 검토 부탁드립니다.

```8:28:src/LottoResultCalculator.js
    lottoCalculateResults() {
      const results = {
        3: 0,
        4: 0,
        5: 0,
        5.5: 0,
        6: 0,
      };
  
      this.tickets.forEach((ticket) => {
        const matchCount = ticket.getMatchCount(this.winningNumbers);
        // 5개 번호와 보너스 번호가 모두 일치하는 경우 2등 처리
        if (matchCount === 5 && ticket.hasNumber(this.bonusNumber)) {
          results[5.5]++;
        } else if (results[matchCount] !== undefined) {
          results[matchCount]++;
        }
      });
  
      return results;
    }
```


- 예외 처리가 충분히 견고한지, 놓친 부분은 없는지 확인 부탁드립니다.
- 각 클래스의 책임 분리가 적절한지 검토 부탁드립니다.
- 테스트 케이스가 충분한지, 추가로 필요한 테스트는 없는지 조언 부탁드립니다.

 

 

 

과제 후 소감

이번 3주차 로또 과제를 통해 저는 코드의 가독성과 재사용성을 높이기 위해 많은 고민을 하였습니다. 지난 2주차 다른 우테코 참여원의 피드백을 기반으로 클래스와 함수의 역할을 명확히 분리하고자 하였고, 각 기능 별로 코드가 독립적으로 작동하도록 구조화했습니다. 또한, 변수 네이밍에 있어 직관적이고 명확한 이름을 사용함으로써, 주석의 사용을 줄이고, 코드의 이해도를 높이고자 노력했습니다. 

이러한 과정을 통해 코드의 설계가 얼마나 중요한지, 그리고 가독성이 좋은 코드가 팀워크와 개발 효율성에 어떤 긍정적인 영향을 줄 수 있는지에 대해 다시 한번 생각해보게 되는 좋은 기회였습니다.

이번 3주차 과제 이후 저의 코드에 대한 리뷰 뿐만 아니라 다른 사람의 코드도 리뷰하는 경험을 하고, 남은 코딩 테스트를 위해 javascript에 대한 스터디를 진행해볼 계획입니다.

감사합니다.

 

 

 

 

 

아무튼 제출 완료 !

 

 

 

 

 

'대외 활동 > 우아한테크코스' 카테고리의 다른 글

[회고] 레벨2 1주차 회고  (1) 2025.05.03
[우테코] 프리코스 2주차  (0) 2025.01.26
[우테코] 프리코스 1주차  (0) 2024.10.28