👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[프로그래머스] 다트

728x90
반응형

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

 

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

 

programmers.co.kr

 

다트를 총 3번 던져서 얻는 총 점수를 계산하는 문제, 

 

단 한 판에 "점수 | 보너스 | 옵션"이 존재할 수 있다. 모두 문자열로 오는 정보이기에 알맞게 split하는게 우선일 것 이다. 

 

1. 판 별로 문자열 나누기 

2. 판 별 점수 계산

3. 총합내기

 

바로 코드로!

 

func solution(_ dartResult:String) -> Int {
    var totalScore = [Int]()
    var curScore = Array(repeating: "", count: 3)
    var idx = 0
    let options = ["*","#"]
    
    // 1. 판별로 나누기 
    for score in dartResult {
        let value = String(score)
        if score.isNumber {
            curScore[idx] += value
        } else {
            if options.contains(value) {
                
                if idx != 0 {
                    curScore[idx-1] += value
                } else {
                    curScore[0] += value
                }
                
            } else {
                curScore[idx] += value
                idx += 1    
            }
        }
    }

    // 2. 판별 점수 계산
    for i in 0..<curScore.count {
        var num = ""
        
        for v in curScore[i] {
            if v.isNumber {
                num += String(v)
            } else {
                switch v {
                    case "S":
                        totalScore.append(Int(num)!)
                    case "D":
                        totalScore.append(pow(Int(num)!,2))
                    case "T":
                        totalScore.append(pow(Int(num)!,3))
                    case "*":
                        totalScore[i] *= 2
                        if i > 0 {
                            totalScore[i-1] *= 2
                        }
                    case "#":
                        totalScore[i] *= -1
                    default:
                        break
                }
            }
        }
    }
    
    // 3. 총합내기 
    return totalScore.reduce(0,+)
}

func pow(_ a: Int,_ b: Int ) -> Int {
    var res = 1
    for _ in 0..<b {
        res *= a
    }
    return res
}

[ 프로세스 ] 

 

1. 판 별로 문자열 나누기

2. 판 별 점수 계산

3. 총합내기

 


그리 어려운 문제는 아니기에 간략하게 보고 넘어가본다! 

문자열을 자르고, 케이스에 맞는지 보고, 타입에 유의하면서 풀이하면 문제 없이 풀 수 있을 것 같다. 

728x90
반응형