코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.1) - [1차] 다트 게임

유정주 2022. 2. 28. 22:52
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 프로그래머스 - [1차] 다트 게임 문제를 풀었습니다.

 


목차


    Github

     

    GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

    스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

    github.com

     

    문제 링크

    https://programmers.co.kr/learn/courses/30/lessons/17682

     

    코딩테스트 연습 - [1차] 다트 게임

     

    programmers.co.kr

     


    풀이

    이번 문제는 꽤 어려웠습니다 ㅠㅠ

    문자열 처리로 어떻게든 해보려고 했는데 안 돼서 스택 개념을 이용해서 풀었습니다.

    해당 포스팅에서는 다른 사람의 split 사용법을 참고해서 수정한 버전을 설명하겠습니다.

     

    스택으로 풀었을 때의 힘들었던 점은 10점이 존재했기 때문에 0 -> 1로 append 돼서 reverse 작업도 따로 해줘야 했고 두 자리 숫자 처리도 해줘야 했는데요.

    split(whereSeparator:)를 이용해서 숫자를 기준으로 자르거나, 문자를 기준으로 자를 수 있었습니다.

    쉽게 말해 스택을 이용한 부분을 통째로 삭제하고 두 줄로 처리할 수 있게 되었습니다.

     

    문자를 기준으로 잘라서 숫자 배열을 만들었고, 숫자를 기준으로 잘라서 문자 배열을 만들었습니다.

    문자 배열에서 하나씩 빼와서 한 글자 한 글자 따로 처리해서 score에 적절한 계산을 해줍니다.

     

    코드가 길지 않으니 봐보시고 이해가 안 되는 점은 댓글로 남겨주세요.

     


    전체 코드

    func solution(_ dartResult:String) -> Int {
        var scores = dartResult.split(whereSeparator: { !$0.isNumber }).compactMap { Int($0) }
        let letters = dartResult.split(whereSeparator: { $0.isNumber })
        
        for (index, letter) in letters.enumerated() {
            letter.forEach {
                let score = scores[index]
                switch $0 {
                case "D":
                    scores[index] = score * score
                case "T":
                    scores[index] = score * score * score
                case "*":
                    scores[index] = 2 * score
                    if index - 1 >= 0 {
                        scores[index - 1] = 2 * scores[index - 1]
                    }
                case "#":
                    scores[index] = -score
                default:
                    break
                }
            }
        }
            
        return scores.reduce(0, +)
    }

    아직은 초보 개발자입니다.

    더 효율적인 코드 훈수 환영합니다!

    공감 댓글 부탁드립니다.

     

     

    반응형