본문 바로가기

알고리즘/프로그래머스

프로그래머스 - 다트게임

programmers.co.kr/learn/courses/30/lessons/17682?language=swift

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 


다트게임 점수구하기!

 

기본적으로 점수는 3개로 구성 -> 숫자는 세개

3가지 영역 S, D, T -> 각 1제곱, 2제곱, 3제곱

보너스 상 *, # -> *는 이전 점수, 지금 점수 * 2, #는 지금 점수 * -1

 

일단 배열에 각 점수별로 계산을 해두고 마지막에 reduce로 합치기로 생각하고

 

반복문을 하나 돌려서 점수를 하나씩 배열에 담고 문자열을 만나면 담긴 점수를 가지고 계산

if 문에서 else 로 바로바로 점수를 배열에 담았더니 10과 같은 숫자는 ["1", "0"] 이렇게 담기길래 number라는 변수를 하나 줘서 문자열을 만나기까지 합쳐두었다가 배열에 담아줌

 

그리고 각 문자를 만나면 그냥 단순히 계산만 해주면 해결 

추가적인 조건은 *이 처음에 나오면 첫 점수만 *2, *이 중복되면 *4, # * 이 중복되면 * -2

func solution(_ dartResult:String) -> Int {
    let dartList = dartResult.map { $0 }
    
    var calc = [Int]()
    
    var number = ""
    
    for dart in dartList {
        if Int(String(dart)) == nil {
            if let n = Int(number) {
                calc.append(n)
                number = ""
            }
            switch String(dart) {
            case "S":
//                calc[calc.count - 1] = Int(pow(Double(calc.last!), 1))
                calc[calc.count - 1] = calc.last!
            case "D":
//                calc[calc.count - 1] = Int(pow(Double(calc.last!), 2))
                calc[calc.count - 1] = calc.last! * calc.last!
            case "T":
//                calc[calc.count - 1] = Int(pow(Double(calc.last!), 3))
                calc[calc.count - 1] = calc.last! * calc.last! * calc.last!
            case "*":
                if calc.count > 1 {
                    calc[calc.count - 2] = calc[calc.count - 2] * 2
                }
                calc[calc.count - 1] = calc.last! * 2
            case "#":
                calc[calc.count - 1] = calc.last! * -1
            default:
                break
            }
        } else {
            number.append(dart)
        }
    }
    
    return calc.reduce(0, +)
}