본문 바로가기
Algorithm

[Algorithm] Swift 백준 10773번

by ykr0919 2024. 4. 6.

 

 

 

https://www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

 

 

문제접근 

 

재현이가 잘못된 수를 입력할 때마다 0을 외치고 -> 재민이가 최근에 쓴 수를 지운다고 함!! 

 

최근에 쓴 수를 지운다는 말에 Stack 자료구조가 떠올랐음!! 💡

 

Stack구조는 후입선출(Last In First Out) 개념임 

 

우선 빈 배열을 만들어주고

 

if문을 사용하여 0이 아닐 때는 배열에 값을 넣어주고,

 

0이면 removeLast()를 이용해서 가장 최근에 추가된 값을 지워주면 될 거 같았음! 

 

 

공식문서에 따르면 컬렉션의 마지막 요소를 제거하고 반환한다고 함!! 

 

정답풀이 

 

import Foundation

let k = Int(readLine()!)!
var n:[Int] = []

for _ in 0..<k {
    let input = Int(readLine()!)!
    if input != 0 {
        n.append(input)
    } else {
        n.removeLast()
    }
}

n.isEmpty ? print(0) : print(n.reduce(0, +))

 

마지막에는 배열에 있는 값이 다 지워져서 값이 없으면 0을 출력해 주고 

 

남아있는 숫자들이 있으면 배열의 값들을 모두 더해주었음!!

 

 

공식문서에 따르면 주어진 클로저를 사용하여 시퀀스의 요소를 결합한 결과를 반환한다고 함.

 

reduce에는 매개변수로 

 

 initialResult  - 초기값으로 사용할 값을 넣으면 클로저가 처음 실행될 때, nextPartialResult에 전달

 

 nextPartialResult - 컨테이너의 요소를 새로운 누적값으로 결합하는 클로저임.

 

를 가지고 있음. 

 

 

🔼  위코드를 다시 보면 n.reduce(0, +)는  초기값으로 0을 주었고 n배열의 값들을 더해주고 있음 

 

근데!!

 

reduce 리턴타입은 

 

최종 누적 값이 반환되며, 컨테이너의 요소가 없다면 initialResult의 값이 반환된다고 함.

 

그때 생각이 든 게 🤔 

 

그럼 남아있는 숫자들이 없으면 컨테이너의 요소가 없어서 초기값으로 반환되겠는데~~~ 

 

그럼 굳이 3항 연산자로 작성해 둔 코드에서

 

print(n.reduce(0, +))

 

이 코드만 있어도 되겠는데~~라고 생각함! 

 

요렇게 최종 코드임  🔽

import Foundation

let k = Int(readLine()!)!
var n:[Int] = []

for _ in 0..<k {
    let input = Int(readLine()!)!
    if input != 0 {
        n.append(input)
    } else {
        n.removeLast()
    }
    
}
print(n.reduce(0, +))

 

사실 백준에 제풀했을 때  두 코드 모두 맞지만~~!! 

 

 공식문서를 살펴보면서 그냥 넘어가지 않고 리턴값에 주목해서 불필요한 코드를 제거해 보았음!! 🔥