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, +))
사실 백준에 제풀했을 때 두 코드 모두 맞지만~~!!
공식문서를 살펴보면서 그냥 넘어가지 않고 리턴값에 주목해서 불필요한 코드를 제거해 보았음!! 🔥
'Algorithm' 카테고리의 다른 글
| [Algorithm] Swift 백준 18110번 (1) | 2024.04.14 |
|---|---|
| [Algorithm] Swift 백준 15829번 (0) | 2024.04.13 |
| [Algorithm] Swift 유클리드 호제법 (최대공약수), 그리고 최소공배수 (2) | 2024.03.29 |
| [Algorithm] Swift 에라토스테네스의 체(소수 구하기) (3) | 2024.03.23 |
| [Algorithm] Swift 백준 1676번 (2) | 2024.03.15 |