프로그래머스_다트게임,

hankyulee·2021년 11월 15일
0

NeededToRetry

목록 보기
2/4

pow함수는 Foundation import 필요, 제곱 pow(a,b) 의 a는 decimal이어야함.

import Foundation
func solution(_ dartResult:String) -> Int {
    var array = Array(dartResult).map{String($0)}
    var nArray = ["0","1","2","3","4","5","6","7","8","9","10",]
    var sArray = ["S","D","T"]
    var A = [Int]()
    var B = [String]()
    var C = [String]()
    var flag = false
    var tenFlag = false
    
    

    for (i,n) in array.enumerated(){
        if nArray.contains(n){
            if array[i+1] != "0" {//10이 아닐때
                if tenFlag == true {
                    tenFlag = false
                    continue
                }
                tenFlag = false
                A.append(Int(n)!)      
            }
            else if array[i+1] == "0" {// 뒤에게 0 이면 10이다.
                A.append(10)
                tenFlag = true
            }
        }
        
        if sArray.contains(n){
            B.append(n)
            flag = true
        }
        else if flag == true {
            if n == "#" || n == "*"{C.append(n)}
            else {C.append("1")}
            flag = false
        }
    }
    
    if C.count != 3 {C.append("1")}
    var newB:[Int] = B.map{ 
        switch $0 {
            case "S" : return 1
            case "D" : return 2
            case "T" : return 3
            default : return 1
        }
    }
    var newC:[Int] = C.map{
        switch $0 {
            case "1" : return 1
            case "#" : return -1
            case "*" : return 2
            default : return 1
        }
    }
    if C[2] == "*" {
        newC[1] *= 2
        
    }
    if C[1] == "*"{
        newC[0] *= 2
    }

    var result = 0
    var zegob = 1
    print(A,newB,newC)
    for i in stride(from:2,through:0,by:-1){
        zegob = 1
        for _ in 0..<newB[i]{
            zegob *= A[i]
        }
        let a = zegob * newC[i]  
        result += a
    }
    
    return result
    
    return 0 
}

그리고 1등 코드: string 쪼개기는 split을 사용해야할 것같다. 아래에서 split으로 필요없는 문자들을 걸러낸다. 또한 두 문자열의 길이가 같기에 zip 함수를 사용했다.

func solution(_ dartResult:String) -> Int {

        let numberList = dartResult.split(whereSeparator: {$0.isLetter || $0 == "#" || $0 == "*"})
        let letterList = dartResult.split(whereSeparator: {$0.isNumber})

        var totalScore = 0

        for (i, (number, letter)) in zip(numberList, letterList).enumerated() {
            var score = 0
            if let number = Int(number) {
                score = letter.contains("D") ? number * number : letter.contains("T") ? number * number * number : number

            }

            if letter.contains("*") {
                score *= 2
            } else if letter.contains("#") {
                score = -score
            }

            if i != 2 {
                if letterList[i + 1].contains("*") {
                    score *= 2
                }
            }

            totalScore += score

        }


        return totalScore
}

참고로 아래처럼 trail argument 제거가능하다. 그러나 whereSeparator대신 seperator은 안된다,

0개의 댓글