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스러운 코드를 작성한다는 목적으로 리팩토링하는 재미도 있었던 문제이다.
전에는 논리적으로 올바른 코드라면 어떻든 상관없다고 생각했는데,
이렇게 언어의 특성을 이용한 코드를 작성한다고 생각하니 셀프 난이도 업이라는 느낌을 받아 재밌었다.
반응형
'🐣 알고리즘' 카테고리의 다른 글
[프로그래머스] Swift - 타겟 넘버 (LV.2) (0) | 2023.06.19 |
---|---|
[프로그래머스] Swift - 택배배달과 수거하기 (LV.2) (0) | 2023.06.18 |
[프로그래머스] Swift - 테이블 해시 함수 (LV.2) (1) | 2023.06.16 |
[프로그래머스] Swift - 카펫 (LV.2) (0) | 2023.06.16 |
[프로그래머스] Swift - 실패율 (LV.1) (0) | 2023.06.15 |
댓글