머리말
문제 링크
코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스 스쿨
이 문제를 선택한 이유
- 구현 문제 연습
풀이
도저히 안 풀려서… 결국 구글링을 했다😭
참고 사이트 링크
풀이 핵심 → 스택
문제 풀이의 핵심은 "스택"을 구현하여, 주어진 배열의 요소를 하나하나 꺼내면서 이에 대한 조건문에 따라 스택에 삽입하거나 삭제하는 것이다.
풀이 순서
- 문자열의 문자 하나하나를 요소로 하는 배열을 만든다.(dartArr)
- 다만,숫자 10은 2글자이기에 1번에 앞서 10을 "a"로 변환한다.
- "S", "D", "T"를 각각 1, 2, 3에 해당하는 딕녀서리를 할당한다.(bonusDict)
- 빈 스택을 할당한다.(stack)
- 이제 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
}
꼬리말
문제 자체는 어렵지는 않아 보였는데 코드로 구현하려니 너무 막막했다.
생소한 메서드와 옵셔널
참고 사이트는 파이썬이어서 스위프트로 옮겼다. 모르는 메서드가 수두룩하고 옵셔널을 계속 신경써야 하는 게 되게 번거로웠다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] (2018 카카오) 프렌즈4블록 (0) | 2023.06.07 |
---|---|
[프로그래머스] (Swift) 정수를 나선형으로 배치하기 (0) | 2023.06.05 |
[프로그래머스] 두 수의 합 (2) | 2023.05.30 |
[프로그래머스] (Swift) 크기가 작은 부분 문자열 - Lv.1 (0) | 2023.05.11 |
[프로그래머스] (Swift) 카펫 - Lv.2 (0) | 2023.05.10 |
댓글