본문 바로가기

프로그래머스 (Swift)/lv 1

[lv1] [1차] 다트 게임

문제

 

내 정답 코드

import Foundation

// 기회 구조체 생성
struct Chance {
    let score: Int // 점수
    let bonus: String // 제곱 보너스
    var bonusScore: Int { // 보너스에 따른 제곱근
        if bonus == "S" {
            return 1
        } else if bonus == "D" {
            return 2
        } else {
            return 3
        }
    }
    let option: String? // 스타상, 아차상
}

func solution(_ dartResult:String) -> Int {
    var dartResult = dartResult.map { String($0) }
    var chances: [Chance] = []
    
    // Chance 생성자를 위해 저장
    var score: Int = 0
    var bonus: String = ""
    var option: String?
    
    // dartResult 문자열 배열을 탐색한다.
    for i in 0..<dartResult.count {
        // 먼저 보너스 3개 중 하나일 경우, bonus에 값을 저장한다.
        if dartResult[i] == "S" || dartResult[i] == "D" || dartResult[i] == "T" {
            bonus = dartResult[i]
            // 보너스 다음 문자가 *나 #인 경우 option을 저장한다.
            if (i+1) < dartResult.count && (dartResult[i+1] == "*" || dartResult[i+1] == "#") {
                option = dartResult[i+1]
            }
            // 보너스 조건이 들어오면, score와 option은 이미 저장했기 때문에 생성자를 배열에 추가한다.
            chances.append(Chance(score: score, bonus: bonus, option: option))
            // 생성자로 추가했으니 초기화 수행
            option = nil
            bonus = ""
            score = 0
        } else if dartResult[i] == "*" || dartResult[i] == "#" {
            // continue
        } else if let num = Int(dartResult[i...i+1].joined()) {
            // score가 10인 경우의 조건문
            score = num
        } else if let num = Int(dartResult[i]) {
            // score가 10 아닌 경우의 조건문
            if score != 10 {
                score = num
            }
        }
    }
    // 3번의 기회를 0점으로 선언한다.
    var chanceScore: [Int] = [0, 0, 0]
    
    for i in 0..<chances.count {
        // 기본적인 점수를 계산하여 더한다. pow로 제곱근 계산
        chanceScore[i] = Int(pow(Double(chances[i].score), Double(chances[i].bonusScore)))
        // 나의 옵션으로 점수 추가 계산
        if chances[i].option == "*" {
            chanceScore[i] *= 2
        } else if chances[i].option == "#" {
            chanceScore[i] *= -1
        }
        
        // 앞 기회의 옵션으로 점수 추가 계산
        if i < chances.count-1 {
            if chances[i+1].option == "*" {
                chanceScore[i] *= 2
            }
        }
    }
    
    // 구한 3개의 기회 점수를 합산해서 반환
    return chanceScore.reduce(0,+)
}

 

#

1. 풀이는 주석으로 대체

2. 내 코드는 빈틈이 많다. 인덱스 관리가 허술하고, 예외 처리를 덜 생각하고 있으므로 고쳐야 함.


배운 기술

'프로그래머스 (Swift) > lv 1' 카테고리의 다른 글

[lv1] 문자열 다루기 기본  (0) 2024.10.23
[lv1] 수박수박수  (0) 2024.10.23
[lv1] 이상한 문자 만들기  (0) 2024.10.21
[lv1] K번째 수  (0) 2024.10.20
제일 작은 수 제거하기  (0) 2024.10.16