본문 바로가기
🐣 알고리즘

[프로그래머스] Swift - 컨트롤 제트 (LV.1)

by @Eddy 2023. 6. 17.
728x90

👆문제풀러 가기👆

문제 설명

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

제한 사항

 

  • 1 ≤ s의 길이 ≤ 200
  • -1,000 < s의 원소 중 숫자 < 1,000
  • s는 숫자, "Z", 공백으로 이루어져 있습니다.
  • s에 있는 숫자와 "Z"는 서로 공백으로 구분됩니다.
  • 연속된 공백은 주어지지 않습니다.
  • 0을 제외하고는 0으로 시작하는 숫자는 없습니다.
  • s는 "Z"로 시작하지 않습니다.
  • s의 시작과 끝에는 공백이 없습니다.
  • "Z"가 연속해서 나오는 경우는 없습니다.

입출력 예

s result
"1 2 Z 3" 4
"10 20 30 40" 100
"10 Z 20 Z 1" 1
"10 Z 20 Z" 0
"-1 -2 -3 Z" -3

풀이 [ 메모리: 16.5mb, 최대시간: 0.31ms ] 

func solution(_ s:String) -> Int {
    var s = s.split(separator: " ")
    var nums = [Int]()
    
     for word in s {
         if word == "Z" {
             nums.removeLast()
             continue
         }
         nums.append(Int(word)!)
     }
    
    return nums.reduce(0, +)
}

대표적인 스택문제.

스택에 대한 이해가 있다면 특별히 고려할 사항은 없고, 스택에 대해 모르더라도 푸는 데 지장없었을 문제이다.

 

근데 매번 이렇게 푸니 심심하다는 생각이 들어 Swift의 특성을 이용해 풀어보고 싶었다.

func solution(_ s:String) -> Int {
    // Optional을 이용한 풀이
    var s = s.split(separator: " ").map { Int($0) }
    var nums = [Int]()
    
    for num in s {
        // optional(Int)에 Int값이 오지 않으면 nil이므로,
        // "Z"가 왔을 때 nil이 된다!
        if num == nil {
             nums.removeLast()
             continue
         }
         nums.append(num!)
    }
    
    return nums.reduce(0, +)
}

 

Optional을 이용해 풀어봤는데, 이러면 강제언래핑이 신경쓰인다. (논리적으로 문제되는 부분은 아니긴 하다.)

옵셔널 바인딩을 해서 더 swift스러운 코드를 만들어보자.

func solution(_ s:String) -> Int {
    var s = s.split(separator: " ").map { Int($0) }
    var nums = [Int]()
    
    for num in s {
        if let num = num {
            nums.append(num)
            continue
        }
        nums.removeLast()
    }

    return nums.reduce(0, +)
}
func solution(_ s:String) -> Int {
    var s = s.split(separator: " ").map { Int($0) }
    var nums = [Int]()
    
    for num in s {
        guard num == nil else {
            nums.append(num!)
            continue
        }
        nums.removeLast()
    }

    return nums.reduce(0, +)
}

엄청 쉬운 문제이지만, Swift스러운 코드를 작성한다는 목적으로 리팩토링하는 재미도 있었던 문제이다.

전에는 논리적으로 올바른 코드라면 어떻든 상관없다고 생각했는데,

이렇게 언어의 특성을 이용한 코드를 작성한다고 생각하니 셀프 난이도 업이라는 느낌을 받아 재밌었다.

반응형

댓글