TIL은 편한 말투로 작성됩니다~
아래는 오늘 개발 진행한 코드의 PR 주소이다.
- 숫자 야구 게임 PR (GitHub)
새로운 주차가 시작되며 팀원이 변경되고, 기본 개인 과제로 "숫자 야구 게임 구현"과 문법 공부 자료가 주어졌다.
오늘은 숫자 야구 게임을 구현하며 공부한 내용을 정리할 예정이다.
Shuffled()
숫자 야구 게임 구현 중, 중복되지 않는 숫자 조합을 만들기 위해 suffled() 메서드를 사용하게 되었다.
shuffled()는 원본을 유지하며, 섞인 새로운 배열을 반환한다.
예시 코드
let arr = [1, 2, 3 ]
let newArr = arr.shuffled()
print(arr) // [1, 2, 3] (원본 유지됨)
print(newArr) // [3, 1, 2] (새로운 배열)
반면, shuffle()는 원본 배열 자체를 섞는다.
var arr = [1, 2, 3]
arr.shuffle()
print(arr) // [2, 3, 1]
중복 없는 난수 생성
숫자 야구게임을 구현하다 정답으로 랜덤 숫자 3개를 구현해야하는 상황에서 처음에 아래와 같이 Int.random(in:)을 세 번 돌려서 배열을 만들었다.
var randomValue = [Int](repeating: 0, count: 3)
for i in 0..<randomValue.count {
randomValue[i] = Int.random(in: 0...9)
}
하지만 다음과 같이 조건이 있었다.
- 숫자 3개를 무작위로 뽑는데 중복되면 안된다.
- 첫 번째 자리에는 0이 오면 안된다.
실제로 위 코드를 실행해보면 [2, 7, 2]처럼 중복된 숫자가 나올 수 있고, 첫 번째 숫자가 0이 되는 경우도 발생한다.
그래서 중복 방지와 첫 자리에 0이 오지 않도록 하기 위해 다음과 같은 방법을 사용했다.
- shuffled()를 사용해서 0~9까지 전체를 섞고,
- prefix(n)으로 앞에서부터 원하는 개수(n)만큼 잘랐다.
그런데 여기에도 문제가 있었다. 단순히 0~9 전체를 섞어서 앞에서 3개를 자르면 중복은 피할 수 있지만, 첫 번째에 0이 나올 수도 있다는 점이었다.
결국 아래 코드처럼 첫 번째 숫자는 1~9 중에서 먼저 뽑고, 나머지는 0~9 중에서 첫 숫자를 제외한 값들 중에서 섞어 두 개를 고르는 방식으로 문제를 해결했다. (이거 하나 때문에 꽤나 오래 고민했었다..ㅋㅋ)
func makeAnswer() -> [Int] {
let first = (1...9).shuffled().first!
let rest = Array((0...9).filter { $0 != first }.shuffled())
return [first] + rest.prefix(2)
}
- 간단히 설명하자면!
- first는 1~9 중에서 랜덤으로 하나 선택 → 첫 자리에 0이 올 수 없다.
- rest는 전체 숫자(0~9)에서 first를 제외한 값을 섞어 2개 선택 → 중복 없음.
- [first] + rest.prefix(2)로 총 3자리 숫자 완성!
'🖋️ TIL Journal' 카테고리의 다른 글
Convenience init과 프로퍼티 (0) | 2025.05.28 |
---|---|
guard문과 Closure (0) | 2025.05.27 |
미니 프로젝트 발표 & 피드백 (0) | 2025.05.23 |
The requested URL returned error: 403 에러와 GitHub 협업 방식 정리 (0) | 2025.05.22 |
SnapKit과 Git Pull! (0) | 2025.05.21 |