알고리즘 문제 풀이

[Swift] 프로그래머스 LV1. [1차] 다트 게임

lgvv 2022. 3. 19. 19:08

프로그래머스 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
    }