본문 바로가기
Problem Solving

[Swift] 프로그래머스 [1차] 다트 게임(lv. 1)

by DuncanKim 2023. 2. 2.
728x90

[Swift] 프로그래머스 [1차] 다트 게임(lv. 1)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근

문제를 잘 이해하는 것이 중요했다. 1 ~ 9 사이의 순서에 따라 주어진 것을 정확하게 구현해내면 어려움 없이 구현할 수 있는 전형적인 구현 문제였다.

 

dartResult를 한 Character로 끊어서 읽고, 숫자 또는 문자라면 그 안에서 적절하게 분기를 해주고, 만약 그 둘이 아니라면 * or # 이므로 그에 따라 이전 회차의 점수를 두 배 시켜주거나 하나만 두 배를 시켰다.

 

tempNumber 변수를 -1로 초기화하여, 한 자리 숫자와 10을 구분하여 처리하였다. tempNumber에 숫자가 이미 들어가있는데, 또 그 분기문으로 들어온 경우, 숫자가 연속으로 자리한 것, 즉 10이 들어온 것이기 때문에 12~13번 라인을 아래와 같이 구성하였다.

 

 

3. 코드

import Foundation

func solution(_ dartResult:String) -> Int {
    let dartResult = Array(dartResult)
    var answer = [Int]()
    var tempNumber = -1
    var j = 0
    for i in dartResult {
        if i.isNumber {
            if tempNumber == -1 {
                tempNumber = Int(String(i))!
            } else {
                tempNumber = 10
            }
        } else if i.isLetter {
            switch i {
            case "S":
                tempNumber *= 1
            case "D":
                tempNumber = Int(pow(Double(tempNumber), 2.0))
            case "T":
                tempNumber = Int(pow(Double(tempNumber), 3.0))
            default:
                continue
            }
            if j < dartResult.count - 1 && !(dartResult[j + 1].isNumber){
                j += 1
                continue
            } else {
                answer.append(tempNumber)
                tempNumber = -1
            }
        } else {
            switch i {
            case "*" :
                if answer.count == 0 {
                    answer.append(tempNumber * 2)
                    tempNumber = -1
                } else {
                    answer[answer.count - 1] = answer.last! * 2
                    answer.append(tempNumber * 2)
                    tempNumber = -1
                }
            default:
                answer.append(tempNumber * -1)
                tempNumber = -1
            }
        }
        j += 1
    }
    return answer.reduce(0, +)
}
728x90

댓글