프로그래머스 LV1. [1차] 다트 게임
✅ 와 풀긴 풀었는데, 진짜 삽질 많이했네
1. 처음에는 문자열 하나하나 받아서 특정 한 스트림을 구성했을 때, 값을 계산하기로 함.
- 문제점: 10의 경우에는 1, 0으로 분리되어서 로직에 문제가 발생함.
2. [개선] 그렇다면 정규표현식을 사용하고자 함.
- 문제점: 이건 공부를 하고 사용해야할 것 같아서 그냥 다른 방법 ㄱ
3. [개선] split을 사용하기로 함.
- 이 글을 포스팅 하는 이유임.
- 문제점: 옵션의 경우에는 어떻게 처리할지 감이 잡히지 않음.
- 해결했다고 생각
4. [개선] 답이 틀리다고 나옴
- 문제점: 옵션의 (*)의 경우에는 전체가 아니라 이전 점수에만 두배를 하는 로직이었음.
- 알고리즘 개선
✅ 회고
예나 지금이나 문제를 쓱쓱 봐서 결국 나중에 알고리즘이 꼬이게 되는데, 처음부터 더 꼼꼼하게 읽고 이해하자.. 하 -;
+ 정규표현식 공부도 해야겠다.
🟠 아래는 코드인데, split 부분을 한번 집중해서 보자
scoreList -> ["1", "2", "3"]
letterList -> ["D", "S", "T*"]
아래처럼 분리가 된다.
func solution(_ dartResult:String) -> Int {
var answer = 0
let scoreList = dartResult.split { $0.isLetter || $0 == "#" || $0 == "*" }
let letterList = dartResult.split { $0.isNumber }
// print(scoreList)
// print(letterList)
var answerList = [Double]()
for (score, letter) in zip(scoreList,letterList) {
// print(answerList)
var score: Double = Double(score)!
let bonus = letter.first
if bonus == "D" {
score = pow(score,2)
} else if bonus == "T" {
score = pow(score,3)
}
if letter.contains("*") {
// print("✨ \(letter)")
score = score * 2
if answerList.count >= 1 {
var lastScore = answerList.last!
lastScore *= 2
answerList.removeLast()
answerList.append(lastScore)
}
} else if letter.contains("#") {
score = -score
}
answerList.append(score)
}
answerList.forEach {
answer += Int($0)
}
return answer
}
'알고리즘 문제 풀이' 카테고리의 다른 글
[Swift] BOJ 2839 설탕 배달 (0) | 2022.03.22 |
---|---|
[Swift] 프로그래머스 LV1. 소수 찾기 (0) | 2022.03.19 |
[Swift] 프로그래머스 LV1. [1차] 비밀지도 (0) | 2022.03.19 |
[Swift] 프로그래머스 LV1. 최소직사각형 (0) | 2022.03.18 |
[Swift] 프로그래머스 LV1 실패율(시간 초과 해결) (1) | 2022.03.17 |