알고리즘관련/문제풀이
큰 수 만들기(그리디, 탐욕법)[프로그래머스].swift
안토니1
2022. 5. 22. 16:12
파이썬으로 먼저 풀고 swift로 풀었더니 비효율적으로 풀었던 것 같다.
풀이과정을 요약하면 다음과 같다.
1) 빈 배열 answer과 제거 가능 횟수 cnt를 선언한다.
2) numbers의 원소 각각에 대한 반복문을 진행한다.
3) 이때 answer이 비여있다면 숫자를 추가해준다.
4) 제거 가능 횟수가 있으며 현재의 num이 answer의 마지막보다 큰 경우엔 마지막 원소를 제거하고 제거 가능 횟수를 하나 차감한다.
5) 배열이 비거나 제거 가능 횟수가 0이 될 때 까지 4를 반복한다.
6) 배열에 num을 추가한다.
7) 만약 차감 횟수가 남아있음에도 원하는 결과를 얻었다면 반복문을 종료한다.
처음 풀이(not good)
import Foundation
func solution(_ number:String, _ k:Int) -> String {
let numbers = number.map{ $0 }
var cnt = k
var answer = [Character]()
for num in numbers {
if answer == [] {
answer.append(num)
continue
}
if cnt > 0 {
while Int(String(answer.last!))! < Int(String(num))! {
answer.removeLast()
cnt -= 1
if answer == [] || cnt <= 0 {
break
}
}
}
answer.append(num)
if answer.count == numbers.count - cnt {
break
}
}
return String(answer)
}
print(solution("1231234", 3))
최종 풀이
import Foundation
func solution(_ number:String, _ k:Int) -> String {
let numbers = number.compactMap{ Int(String($0))}
var cnt = k
var answer: [Int] = []
for num in numbers {
if answer == [] {
answer.append(num)
continue
}
if cnt > 0 {
while answer.last! < num {
answer.removeLast()
cnt -= 1
if answer == [] || cnt <= 0 {
break
}
}
}
answer.append(num)
if answer.count == numbers.count - cnt {
break
}
}
// return answer.map { String($0) }.joined()
return answer.map { "\($0)" }.joined()
}
print(solution("1924", 2)) // 94
print(solution("1231234", 3)) // 3234
print(solution("4177252841", 4)) // 775841
- compactMap
- 1차원 배열에서 nil을 제거하고 옵셔널 바인딩을 하고싶을 때 사용한다.
func compactMap<ElementOfResult>(_ transform: (Int?) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
- joined()
- 배열의 문자열들을 하나로 연결한 문자열을 반환한다.
- array.joined(separator:"결합문자")
두번 째 풀이에선 [Int] 배열에 Int 값으로 배열에 넣어주었다.
또한 compactMap을 사용해 옵셔널과 관련해 코드가 훨씬 깔끔하고 안전하게 바뀌었다.