[TIL] 숫자 야구 게임 트러블슈팅

박주하·2025년 5월 30일

1. 숫자 배열 변환 시 compactMap vs map 차이


⚠️ 문제

let numberArray = number.map { $0.wholeNumberValue }
  • map은 변환 후 Optional을 포함한 배열을 반환한다.

✅ 해결

let numberArray = number.compactMap { $0.wholeNumberValue }
  • compactMap은 nil을 제거하고 실제 값만 추출한다.
  • 유저 입력에서 숫자만 추출하려면 compactMap을 사용하는 것이 더 적합하다.
구문결과 타입nil 처리 방식
map { $0.wholeNumberValue }[Int?] (옵셔널 포함)nil을 그대로 유지
compactMap { $0.wholeNumberValue }[Int] (옵셔널 제거됨)nil을 자동으로 제거

2. number.compactMap 중복 호출


⚠️ 문제

	func checkInputNumber(_ number: String) -> Bool {
        let numberList = number.compactMap { $0.wholeNumberValue }
        return numberList.count == 3 && Set(numberList).count == 3 && numberList[0] != 0
    }
    
    func checkUserAnswer(userNumber: String, answer: [Int]) -> Bool {
        var strikes = 0
        var balls = 0
        trialCount += 1
        let userNumberList = userNumber.compactMap { $0.wholeNumberValue }
        
        //...
    }
  • 동일한 입력값에서 숫자 배열을 두 번 추출한다. → 중복 처리 발생

✅ 해결

let (isValid, userNumberArray) = checkInputNumber(userInput)

	func checkInputNumber(_ number: String) -> (isOk: Bool, userNumberArray: [Int]) {
        let numberArray = number.compactMap { $0.wholeNumberValue }
        let isOk = numberArray.count == 3 && Set(numberArray).count == 3 && numberArray[0] != 0
        
        return (isOk, numberArray)
    }
    
    func checkUserAnswer(userNumber: [Int], answer: [Int]) -> Bool {}
  • checkInputNumber 함수에서 숫자 배열도 함께 반환하도록 튜플 반환 구조 도입하여 해결

3. 맨 앞자리에 0이 오지 않도록 하기


⚠️ 문제

func makeAnswer() -> [Int] {
    let selectNumbers = Array(0...9).shuffled().prefix(3)

	return Array(selectNumbers)
}
  • 0...9를 섞다 보니 012 같은 숫자 생성 가능

✅ 해결

func makeAnswer() -> [Int] {
    let firstNumber = Int.random(in: 1...9)
    let remainNumbers = Array(0...9).filter { $0 != firstNumber }.shuffled().prefix(2)
        
    return [firstNumber] + Array(remainNumbers)
}
  • 첫 숫자는 1~9 중에서 고정
  • 나머지 두 숫자는 0~9(첫 숫자 제외) 중 중복 없이 섞어서 생성

4. 중복된 숫자 유효성 검사 코드 개선


⚠️ 문제

numberList[0] != numberList[1] && numberList[1] != numberList[2] && numberList[0] != numberList[2]

✅ 해결

Set(numberList).count == 3
  • Set을 사용하여 더 간결하게 중복 검사

💡 전체 코드
https://github.com/Pjh01/NumberBaseballGame

0개의 댓글