TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 큰 수 만들기
여의도사노비
2023. 1. 26. 13:09
728x90
문제 유형이 Greedy라고 나와있어서 아.. 이게 그리디구나 싶었다..
좀 더 명확하게 하기 위해 개념을 찾아보니
'매 순간마다 최선의 경우를 고르고 다른 경우는 고려하지 않는' 알고리즘이라고 한다.
참고한 블로그에도 나와있지만 그리디의 가장 큰 문제는 최적의 해를 구하기 어렵다는 것이다.
어떤 주어진 상황에서 최고의 결과를 내기 위함이기 때문에, 그 주어진 상황이라는 것이 바뀔 때마다 최적의 해도 바뀐다.
즉, 반례 혹은 특별한 상황에 대한 대비가 되어야 한다.
(참고: https://dev-mandos.tistory.com/80)
이 문제를 풀면서 생각한 논리적 흐름
- 결국 가장 중요한 것은 앞자리이다.
- 내가 사용할 수 있는 count(k) 안에서 가장 앞자리에 큰 수를 올리고 그 다음으로 오는 숫자들도 크기 순으로 올려준다.
- 그래서 stack의 특징을 차용하여 ans 배열을 만들고
- ans에 하나씩 원소를 담은 뒤 각 원소마다 값을 비교하여 들어와 있는 원소가 들어올 원소에 비해 값이 작으면 삭제해주는 것을 반복한다.
- 이렇게 삭제가 k번 만큼 일어났을 때 함수를 종료한다.
* 코드
import Foundation
func solution(_ number:String, _ k:Int) -> String {
let arrNumber: [Character] = Array(number)
var count = k
var ans: [Character] = []
for i in arrNumber {
while !ans.isEmpty && count > 0 &&
ans.last!.wholeNumberValue! < i.wholeNumberValue! {
ans.removeLast()
count -= 1
}
if ans.count < arrNumber.count - k {
ans.append(i)
}
}
return String(ans)
}
정리(Today I Learned)
1. String의 경우 Int를 써주면 쉽게 타입을 변환시킬 수 있다. 하지만 Character의 경우 Int로 감싸도 타입이 변환되지 않는다. 그 때 쓰는 것이 wholeNumberValue이다. 이 메서드의 경우 단순히 "4"라는 Character를 숫자 4로 바꾸는 것 뿐만 아니라, 한자로 표기되거나 기호로 표기된 숫자들도 전부 Int 타입으로 전환해준다.