본문 바로가기
코딩 테스트/프로그래머스

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

by Dev.Andy 2023. 6. 2.

머리말

문제 링크

코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스 스쿨

이 문제를 선택한 이유

  • 구현 문제 연습

 

풀이

도저히 안 풀려서… 결국 구글링을 했다😭

참고 사이트 링크

[프로그래머스 lv1] [1차] 다트 게임 (파이썬)

풀이 핵심 → 스택

문제 풀이의 핵심은 "스택"을 구현하여, 주어진 배열의 요소를 하나하나 꺼내면서 이에 대한 조건문에 따라 스택에 삽입하거나 삭제하는 것이다.

풀이 순서

  1. 문자열의 문자 하나하나를 요소로 하는 배열을 만든다.(dartArr)
  2. 다만,숫자 10은 2글자이기에 1번에 앞서 10을 "a"로 변환한다.
  3. "S", "D", "T"를 각각 1, 2, 3에 해당하는 딕녀서리를 할당한다.(bonusDict)
  4. 빈 스택을 할당한다.(stack)
  5. 이제 1번의 배열의 요소를 반복하면서 문자에 해당하는 조건을 하나하나 구현한다.
    • 숫자(1~10과 "a")일 경우 스택에 해당 숫자를 추가
    • "S" 또는 "D", "T"일 경우 스택의 최근 숫자를 꺼내서 제곱을 한 다음 다시 스택에 추가
    • "#"일 경우 스택의 최근 숫자를 꺼내서 -1 곱하기
    • "*"일 경우 스택의 최근 숫자를 꺼내서 2 곱하기 && 이전 숫자가 있으면 이것 또한 꺼내서 2배를 곱하기
func solution(_ dartResult:String) -> Int {
    
    let dartArr = dartResult.replacingOccurrences(of: "10", with: "a").map { String($0) }
    
    let bonusDict = ["S": 1, "D": 2, "T": 3]
    
    var stack = [Int]()
    
    for ele in dartArr {
        if Int(ele) != nil || ele == "a" { // 0~9 또는 a일 때
            if ele == "a" {
                stack.append(10)
            } else {
                stack.append(Int(ele)!)    
            }
        } else if bonusDict[ele] != nil { // "S" 또는 "D", "T"일 때
            let point = stack.popLast()!
            stack.append(power(point, bonusDict[ele]!))
        } else if ele == "#" { // "#"일 때
            let point = stack.popLast()!
            stack.append(point * -1)
        } else if ele == "*" { // "*"일 떄
            let point = stack.popLast()!
            if stack.count != 0 {
                let lastPoint = stack.popLast()!
                stack.append(lastPoint * 2)
            }
            stack.append(point * 2)
        }
    }
    
    // 스택의 총합을 반환
    return stack.reduce(0, +)
}

// 제곱을 구하는 함수 정의
func power(_ n: Int, _ p: Int) -> Int {
    var sum = 1
    
    for _ in 1...p {
        sum *= n
    }
    
    return sum
}

 

꼬리말

문제 자체는 어렵지는 않아 보였는데 코드로 구현하려니 너무 막막했다.

생소한 메서드와 옵셔널

참고 사이트는 파이썬이어서 스위프트로 옮겼다. 모르는 메서드가 수두룩하고 옵셔널을 계속 신경써야 하는 게 되게 번거로웠다.

댓글