스파르타코딩 클럽/개인과제

6. 스파르타 코딩클럽 [본캠프 - 숫자야구 게임(2)]

UDDT 2025. 3. 18. 23:00

Ch 2. 프로그래밍 심화 주차 과제

 

 숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다.
각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다.
예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다.
이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.

   Lv 1. 에서 내가 작성한 코드

let randomNumber1 = Int.random(in: 1...9)
let randomNumber2 = Int.random(in: 1...9)
let randomNumber3 = Int.random(in: 1...9)
var computerChoice: [Int] = []
computerChoice = [randomNumber1, randomNumber2, randomNumber3]

 

  위의 코드는 배열에 [3, 3, 2] 등의 중복되는 숫자가 담길 수 있다

 Lv. 2

- 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받습니다
   * 힌트는 야구용어인 볼과 스트라이크입니다.
- 같은 자리에 같은 숫자가 있는 경우 스트라이크, 다른 자리에 숫자가 있는 경우 볼입니다
    ex) 정답 : 456 인 경우 435를 입력한 경우 → 1스트라이크 1볼
                    357를 입력한 경우 → 1스트라이크
                    678를 입력한 경우 → 1볼
                    123를 입력한 경우 → Nothing
                     * 만약 올바르지 않은 입력값에 대해서는 오류 문구를 보여주세요
- 3자리 숫자가 정답과 같은 경우 게임이 종료됩니다
   실행 예시(정답 : 456) 
< 게임을 시작합니다 >
숫자를 입력하세요
435
1스트라이크 1볼

숫자를 입력하세요
357
1스트라이크

숫자를 입력하세요
123
Nothing

숫자를 입력하세요
dfg // 세 자리 숫자가 아니어서 올바르지 않은 입력값
올바르지 않은 입력값입니다

숫자를 입력하세요
199 // 9가 두번 사용되어 올바르지 않은 입력값
올바르지 않은 입력값입니다

숫자를 입력하세요
103 // 0이 사용되어 올바르지 않은 입력값
올바르지 않은 입력값입니다

숫자를 입력하세요
456
정답입니다!

   다시 작성한 코드

class BaseballGame {
    func start() {
        print("게임을 시작합니다")
        makeAnswer() // 정답을 만드는 함수
        
        func makeAnswer() -> Int {
        // 컴퓨터 랜덤 숫자 생성
        let randomNumber1 = Int.random(in: 1...9)
        var randomNumber2 = Int.random(in: 1...9)
        var randomNumber3 = Int.random(in: 1...9)

        if randomNumber1 == randomNumber2 {
            randomNumber2 = Int.random(in: 1...9)
        } else if randomNumber2 == randomNumber3 {
            randomNumber3 = Int.random(in: 1...9)
        } else if randomNumber3 == randomNumber1 {
            randomNumber3 = Int.random(in: 1...9)
        }

        let computerChoice = [randomNumber1, randomNumber2, randomNumber3]

        let strComputerChoice = computerChoice.map(String.init).joined()  // ["5", "6", "7"]
        guard let intComputerChoice = Int(strComputerChoice) else { return 0 }
        return intComputerChoice // 567
    }
}

 

   이렇게 작성하면 해결이 될 줄 알았는데,

송스승과 코드 리뷰를 하는 와중에 지금의 코드로도 예외처리가 안된다는 것을 깨달았다.

 

        if randomNumber1 == randomNumber2 {
            randomNumber2 = Int.random(in: 1...9)

 

   위의 코드로 randomNumber1과 randomNumber2를 비교해도,

다시 randomNumber2가 동일한 randomNumber를 뽑게 되면 동일한 숫자가 반영된다.

 

  다시다시 작성한 코드

let randomNumber1 = Int.random(in: 1...9)
var randomNumber2 = Int.random(in: 1...9)
var randomNumber3 = Int.random(in: 1...9)

while randomNumber1 == randomNumber2 || randomNumber1 == randomNumber3 || randomNumber2 == randomNumber3 {
    randomNumber2 = Int.random(in: 1...9)
    randomNumber3 = Int.random(in: 1...9)
}

let computerChoice = [randomNumber1, randomNumber2, randomNumber3]

 

   위의 코드로 바꾸고 나면,

조건이 만족될 때까지 randomNumber를 변경하기 때문에 [3, 4, 6]과 같이 각각 다른 숫자를 뽑아낼 수 있다.