Algorithm Problem Solving/Programmers

[프로그래머스] 코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT [1차] 다트 게임 with Swift

코코자장자장 2021. 12. 5. 15:01

안녕하세요! 오늘은 프로그래머스 다트게임 문제를 풀어보았습니다!

다트 게임문제는 구현 문제였습니다!

 

이 문제도 푸는데 시간이 살짝 걸리는데요!

 

한글자씩 해석하면서 결과물을 만들어내고 결과를 합치면 문제가 해결됩니다!

 

같이 한번 풀어보시죠!

 

1. 다트 게임

 

    우선 한글자씩 해석하기 위해 그리고 이전의 글자 상태에 따라 처리를 다르게 하기 위해 characterStatus enum을 정의합니다.

 

    String에서 한글자씩 가져오기 위해 

 

let char: String = String(dartResult[dartResult.index(dartResult.startIndex, offsetBy: i)])

 

    이런 방식을 사용합니다.

 

    그리고 String이 Int로 형변환 가능한지 여부를 판단하여 숫자인지 글자인지 확인합니다.

if Int(char) != nil {
}
else{
}

        숫자라면 nil이 아니고 글자라면 nil이기 때문에 이렇게 나눌 수 있습니다.

 

        나머지 구현은 Num 배열과 NumPrize배열을 통해 Num에는 점수를 넣고 NumPrize는 -4, -2, -1, 1, 2, 4 를 문제에 맞게 입력하여 마지막에 Num과 NumPrize의 곱의 합을 return하면 정답이 됩니다!

 

enum characterStatus {
    case none
    case char
    case number
    case specialChar
}

func solution(_ dartResult:String) -> Int {
var count = dartResult.count
    var beforeStatus = characterStatus.none
    var Num: [Int] = [Int]()
    var nextNum = 0
    var NumPrize: [Int] = [Int]()

    for i in 0 ..< count {
        let char: String = String(dartResult[dartResult.index(dartResult.startIndex, offsetBy: i)])

        if Int(char) != nil {
            
            if beforeStatus == characterStatus.number {
                nextNum = nextNum*10 + Int(char)!
            }
            else {
                nextNum = Int(char)!
            }
            
            beforeStatus = characterStatus.number
        }
        else if char == "S" || char == "D" || char == "T" {
            
            if char == "D"{
                nextNum = nextNum * nextNum
            }
            else if char == "T"{
                nextNum = nextNum * nextNum * nextNum
            }
            
            Num.append(nextNum)
            NumPrize.append(1)
            beforeStatus = characterStatus.char
        }
        else if char == "*" || char == "#"{
            let numCount = NumPrize.count
            if char == "*" {
                if numCount > 1 {
                    NumPrize[numCount-1] *= 2
                    NumPrize[numCount-2] *= 2
                }
                else {
                    NumPrize[numCount-1] *= 2
                }
            }
            else if char == "#" {
                NumPrize[numCount-1] = -1
            }
            
            beforeStatus = characterStatus.specialChar
        }
        
    }

    let numCount = Num.count
    var result = 0
    for i in 0..<numCount {
        result += Num[i] * NumPrize[i]
    }
    
    return result
}

 

여기까지 긴글 봐주셔서 감사합니다!

 

오늘도 좋은 하루 되세요!