iOS 공부하는 감자

다트 게임 본문

알고리즘

다트 게임

DongTaTo 2022. 1. 31. 01:11
반응형

https://programmers.co.kr/learn/courses/30/lessons/17682?language=swift 

 

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

 

programmers.co.kr

 

 


내 풀이

func solution(_ dartResult:String) -> Int {
    var result = [Int]()
    var index: Int = -1
    var s: Bool = false

    dartResult.components(separatedBy: CharacterSet.decimalDigits.inverted).forEach({
        if let number = Int(String($0)) {
            result.append(number)
        }
    })
    
    for n in dartResult {
        switch n {
        case "S":
            s = false
        case "D":
            result[index] = Int(pow(Double(result[index]), 2))
            s = false
        case "T":
            result[index] = Int(pow(Double(result[index]), 3))
            s = false
        case "*":
            if index > 0 {
                result[index] *= 2
                result[index-1] *= 2
            }else {
                result[index] *= 2
            }
            s = false
        case "#":
            result[index] *= -1
            s = false
        case "0":
            if s == false {
                index += 1
            }
        default:
            index += 1
            s = true
        }
    }

    return result.reduce(0, +)
}

 

다른사람 풀이

func solution(_ dartResult:String) -> Int {

        let numberList = dartResult.split(whereSeparator: {$0.isLetter || $0 == "#" || $0 == "*"})
        let letterList = dartResult.split(whereSeparator: {$0.isNumber})

        var totalScore = 0

        for (i, (number, letter)) in zip(numberList, letterList).enumerated() {
            var score = 0
            if let number = Int(number) {
                score = letter.contains("D") ? number * number : letter.contains("T") ? number * number * number : number

            }

            if letter.contains("*") {
                score *= 2
            } else if letter.contains("#") {
                score = -score
            }

            if i != 2 {
                if letterList[i + 1].contains("*") {
                    score *= 2
                }
            }

            totalScore += score

        }


        return totalScore
}
  1. split(whereSeparator: )을 사용하여 숫자, 문자로만 구성된 배열을 각각 생성
  2. zip()을 사용하여 숫자배열과 문자배열의 요소들을 튜플 형태로 순서대로 가져옴
  3. + enumerated()를 통해 몇 번째 요소를 가져오는지 index 정보도 가져옴
  4. 확정적으로 존재하는 "S", "D", "T"의 값을 적용하여 score 저장
  5. 튜플 형태로 가져온 문자열에 "*", "#" 이 있는지 확인하고 score 반영
  6. if i != 2 조건으로 첫번째, 두번째 index의 스코어만 그 다음 문자열에서 "*" 이 있는지 확인하고 score 반영
  7. totalScore에 점수 누적 저장하고 리턴

 

반응형

'알고리즘' 카테고리의 다른 글

백준 13305  (0) 2022.04.07
실패율  (0) 2022.02.05
신고 결과 받기  (0) 2022.01.24
백준 1920  (0) 2022.01.23
이상한 문자 만들기  (0) 2022.01.22