[과제2] Swift 숫자 야구 게임(Lv1-2)

이유진·2024년 3월 14일
0

과제

목록 보기
3/7

다시 처음부터 차근 차근 해보려고 갈아 엎었다.
Lv1부터 시작!

  • Lv1

    • 1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임입니다

    • 정답은 랜덤으로 만듭니다.(1에서 9까지의 서로 다른 임의의 수 3자리)

      우선 큰 틀을 작성해줬다.

      1. 야구 게임을 실행할 수 있는 class를 만든다.
      2. class의 인스턴스를 생성하고 호출해서 게임을 실행하도록 해준다.
      import Foundation
      
      class NumberBaseball {
          
          func start() {
          
          }
          
      }
      
      let game = NumberBaseball()
      game.start()

      그리고 이어서 내부에 조건들을 실행시킬 구문을 작성해줬다.

      1. 1에서 9까지의 수를 담은 배열을 만든다. (무작위로 섞어줄 것이기 때문에 변수에 담아준다.)
      2. shuffle을 사용해 배열을 섞어준다.
      3. removeSubrange를 사용해 섞인 배열의 Index 3 ~ 8에 해당하는 수들을 삭제한다.
      4. 그럼 Index 0~2에 위치한 수가 남는다.
      5. shuffle을 사용해 무작위로 섞인 수들 중 3개의 수가 남으므로 중복되지 않는 임의의 수 3가지 수를 정할 수 있게 된다!
      import Foundation
      
      class NumberBaseball {
          
          func start() {
              var array = [1...9]
              array.shuffle()
              array.removeSubrange(3...8)
      
              return(array)
          }
          
      }
      
      let game = NumberBaseball()
      game.start()

      근데 여기서 오류 발생…!! 으악!

      Fatal error: Array replace: subrange extends past the end

      배열의 일부를 제거하려는데, 제거하려는 부분이 배열의 범위를 벗어날 때 발생하는 오류라고 한다.
      어디서부터 잘못된 건지 찾아봤다.

      위에서 작성한 코드는 배열을 생성할 때 범위(1...9)를 사용하고 있는데
      이건 범위 자체가 요소가 되는 것이고,
      실제로 1부터 9까지의 숫자를 배열의 요소로 만들어준 것은 아니다.
      즉, 배열의 범위가 단일 요소이기 때문에 배열의 크기가 1이 된다.
      배열의 크기가 1인데(Index 값이 0만 존재),
      removeSubrange로 Index 값 3에서 8까지를 지우려고 했으니
      없는 범위를 지우라고 한 것!! 그래서 오류가 났다.

      오류를 수정하기 위해서는
      범위에 해당하는 숫자들을 요소로 가지는 배열을 생성해줘야 한다.
      Swift에서는 범위를 사용해 배열을 초기화 할 수 없기 때문에
      배열 안에 1부터 9까지 각각의 요소를 담을 수 있도록 해준다.
      이렇게 되면 배열의 크기가 9 즉, Index값을 0부터 8까지 가지는 배열이 만들어진다.
      그럼 removerSubrange로 Index값 3에서 8까지를 삭제해도 문제가 없다.

      그래서 이렇게 수정!

      class NumberBaseball {
          
          func start() {
              var array = Array(1...9) // 1부터 9까지의 숫자로 배열을 초기화
              array.shuffle()
              array.removeSubrange(3...8)
              
              print(array)
          }
      }
      
      let game = NumberBaseball()
      game.start()

      실행할 때마다 랜덤으로 세 개의 수가 출력된다 :>

1개의 댓글

comment-user-thumbnail
2024년 3월 14일

removeSubrange 라는게 있군요! 배워갑니당 범위 자체를 배열에 넣은 거 저도 했던 실수라서 공감하면서 봤어요 ㅎㅎ 과제하는 것도 힘든데 정리까지.. 👍잘하구 계시네요!!

답글 달기