중복 없는 난수 생성. 근데 이제 Shuffled()를 곁들인..

2025. 5. 26. 21:52·🖋️ TIL Journal
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이 오지 않도록 하기 위해 다음과 같은 방법을 사용했다.

  1. shuffled()를 사용해서 0~9까지 전체를 섞고,
  2. 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
  1. Shuffled()
  2. 중복 없는 난수 생성
'🖋️ TIL Journal' 카테고리의 다른 글
  • Convenience init과 프로퍼티
  • guard문과 Closure
  • 미니 프로젝트 발표 & 피드백
  • The requested URL returned error: 403 에러와 GitHub 협업 방식 정리
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 📌 Swift (12)
      • 📱 iOS (11)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (3)
      • 🖋️ TIL Journal (33)
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    prepareconstraints
    Split
    updateconstraints
    셀 높이
    weak
    cow 쓰기 복사
    GitHub
    git moji
    cow 참조 타입
    uikit
    제약조건 수정
    Components
    cow 값 타입
    커밋 이모지
    프로그래머스
    제약조건 변경
    Codable
    remakeconstraints
    swift
    커밋 아이콘
    스크롤 길이
    swift optional
    TiL
    swift cow
    SnapKit
    ios
    후행클로저
    static
    makeconstraint
    Optional
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
중복 없는 난수 생성. 근데 이제 Shuffled()를 곁들인..

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.