[swift]index out of range 오류 //초보자 입니다..

조회수 2490회

xcode 9.2 버전 커맨드라인으로 코딩 중입니다.

makeLadder함수 안의 makeWall 에서 index out of range오류가 발생해서 제대로 결과를 못 받고 있습니다. 어디를 수정해야 올바른 결과가 나올까요..ㅠㅠ

예)

참여할 사람은 몇 명 인가요?
3
최대 사다리 높이는 몇 개인가요?
4

//현재 상태
| | |
| |-|
|-| |
|

//나와야 하는 결과
| | |
| |-|
|-| |
|-| |

코드

import Foundation

// 참여인원 입력 받기
func getPlayer() -> Int {
    print("참여할 사람은 몇 명 인가요?")
    let player = readLine()
    return Int(player ?? "") ?? 0
}

// 사다리 높이 입력 받기
func getLadderHeight() -> Int {
    print("최대 사다리 높이는 몇 개인가요?")
    let ladderHeight = readLine()
    return Int(ladderHeight ?? "") ?? 0
}

// 사다리 발판 준비 - 서브
// false 값을 가지고 있는 배열을 랜덤값에 따라 랜덤하게 false를 true로 바꿈
func randomChange(_ arrLadder:[Bool]) -> [Bool]{
    var ladderArr:[Bool] = arrLadder

    for val in 0 ..< ladderArr.count {
        let random = arc4random_uniform(2)
        ladderArr[val] = (random == 0)
    }
    return ladderArr
}

// 사다리 발판 준비 - 메인
func makeLadderFrame(_ player:Int, _ ladderHeight:Int) -> [[Bool]] {
    var arrLadder: [[Bool]] = Array(repeating: Array(repeating: false, count: player - 1), count: ladderHeight)
    return arrLadder
}
func preparadeToMakeFootBoard(_ ladderHeight: Int, _ player: Int) -> [[Bool]] {
    var arrLadder = makeLadderFrame(player,ladderHeight)
    for row in 0 ..< ladderHeight {
        arrLadder[row] = randomChange(arrLadder[row])
    }
    return arrLadder
}

// 사다리 발판 만들기
// 발판 요소
enum LadderFootBoardElements: String {
    case hasFootBoard = "-"
    case noFootBoard = " "
}

// readyToMakeFootBoard에서 만든 불값2차원배열을 발판 요소들로 대체시키기
func transferBoolToHorizon(booleanElement: Bool) -> String {
    return booleanElement ? LadderFootBoardElements.hasFootBoard.rawValue : LadderFootBoardElements.noFootBoard.rawValue
}

// 사다리 모양 완성시키기 - 서브
func makeWall(_ readyFootBoard:[Bool],_ player: Int) {
    for val in 0 ..< player - 1 {
        let footboard = transferBoolToHorizon(booleanElement: readyFootBoard[val])
        print ("\(footboard)", terminator : "|")
    }
}

// 사다리 모양 완성시키기 - 메인
func makeLadder(_ player: Int, _ ladderHeight:Int) {
    let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight)
    for row in 0 ..< ladderHeight {
        print ("|", terminator: "")
        makeWall(readyFootBoard[row], player)
        print()
    }
}

// main (실행 부)
while true {
    let player = getPlayer()
    let ladderHeight = getLadderHeight()
    makeLadder(player, ladderHeight)

    break
}

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    //이 함수에서 받는 인자가 ladderHeight에 player 값이 들어오고, player에 ladderHeight 값이 들어와서  index out of range 오류가 나는 거 값습니다.
    func preparadeToMakeFootBoard(_ ladderHeight: Int, _ player: Int) -> [[Bool]] {
        var arrLadder = makeLadderFrame(player,ladderHeight)
        for row in 0 ..< ladderHeight {
            arrLadder[row] = randomChange(arrLadder[row])
        }
        return arrLadder
    }
    
    //
    let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight)
    
    

    preparadeToMakeFootBoard 함수에서 받는 인자 변경해주고 player 값에서 -1 해주던거 제거한 소스 입니다. (player값이 높이 값으로 설정이 되어 있어서 -1 해주신거 같아서 일단 뺀 소스로 변경 해봤습니다.)

    //수정한 소스 
    //
    //  main.swift
    //  af
    //
    //  Created by maccli1 on 2018. 1. 22..
    //  Copyright © 2018년 myoung. All rights reserved.
    //
    
    import Foundation
    
    // 참여인원 입력 받기
    func getPlayer() -> Int {
        print("참여할 사람은 몇 명 인가요?")
        let player = readLine()
        return Int(player ?? "") ?? 0
    }
    
    // 사다리 높이 입력 받기
    func getLadderHeight() -> Int {
        print("최대 사다리 높이는 몇 개인가요?")
        let ladderHeight = readLine()
        return Int(ladderHeight ?? "") ?? 0
    }
    
    // 사다리 발판 준비 - 서브
    // false 값을 가지고 있는 배열을 랜덤값에 따라 랜덤하게 false를 true로 바꿈
    func randomChange(_ arrLadder:[Bool]) -> [Bool]{
        var ladderArr:[Bool] = arrLadder
    
        for val in 0 ..< ladderArr.count {
            let random = arc4random_uniform(2)
            ladderArr[val] = (random == 0)
        }
        return ladderArr
    }
    
    // 사다리 발판 준비 - 메인
    func makeLadderFrame(_ player:Int, _ ladderHeight:Int) -> [[Bool]] {
        let arrLadder: [[Bool]] = Array(repeating: Array(repeating: false, count: player), count: ladderHeight)
        return arrLadder
    }
    
    func preparadeToMakeFootBoard(_ player: Int, _ ladderHeight: Int) -> [[Bool]] {
        var arrLadder = makeLadderFrame(player,ladderHeight)
        for row in 0 ..< ladderHeight {
            arrLadder[row] = randomChange(arrLadder[row])
        }
        return arrLadder
    }
    
    // 사다리 발판 만들기
    // 발판 요소
    enum LadderFootBoardElements: String {
        case hasFootBoard = "-"
        case noFootBoard = " "
    }
    
    // readyToMakeFootBoard에서 만든 불값2차원배열을 발판 요소들로 대체시키기
    func transferBoolToHorizon(booleanElement: Bool) -> String {
        return booleanElement ? LadderFootBoardElements.hasFootBoard.rawValue : LadderFootBoardElements.noFootBoard.rawValue
    }
    
    // 사다리 모양 완성시키기 - 서브
    func makeWall(_ readyFootBoard:[Bool],_ player: Int) {
        for val in 0 ..< player {
            let footboard = transferBoolToHorizon(booleanElement: readyFootBoard[val])
            print ("\(footboard)", terminator : "|")
        }
    }
    
    // 사다리 모양 완성시키기 - 메인
    func makeLadder(_ player: Int, _ ladderHeight:Int) {
        let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight)
        for row in 0 ..< ladderHeight {
            print ("|", terminator: "")
            makeWall(readyFootBoard[row], player)
            print()
        }
    }
    
    // main (실행 부)
    while true {
        let player = getPlayer()
        let ladderHeight = getLadderHeight()
        makeLadder(player, ladderHeight)
    
        break
    }
    
    //결과값
    참여할 사람은 몇 명 인가요?
    3
    최대 사다리 높이는 몇 개인가요?
    4
    | | |-|
    | |-| |
    | |-| |
    | | | |
    

    의도가 다를 수 있고, 틀린점이 있다면 댓글 남겨주시면 추가적으로 도와 드리겠습니다.

    • 답변자 분이 고쳐준 코드를 찬찬히 보니 제 코드의 문제점을 알아 낼 수 있었습니다. 제가 preparadeToMakeFootBoard를 호출 할 때 파라미터를 뒤바꿔서 호출 했더라구요... 정말 초보적인 실수를..파라미터 바꿔 줬더니 해결 됬습니다. 앞으론 함수 호출 시 파라미터도 주의해야겠네요..친절한 답변 감사합니다 Jina Kim 2018.1.23 22:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)