문제 설명
number 들어오는거에서 k개 만큼 숫자 지웠을 때 가장 큰 수 구하기
풀이과정
import Foundation
func solution(_ number: String, _ k: Int) -> String {
// 짤라주고 조인해서 INT()로 변환 ?
let numberInt = Array(number)
var answer: [Int] = []
// 남은 개수 확인하면서 비교
let LEN = number.count
let digitCount = LEN - k
// LEN - idx => 남은 갯수
for (idx, item) in Array(number).compactMap({ Int(String($0)) }).enumerated() {
if answer.isEmpty {
answer.append(item)
continue
}
if digitCount - answer.count == LEN - idx {
// 채워야하는 갯수가 남은 개수랑 같을 때는 그냥 다 채워줘야함
answer.append(item)
continue
}
else {
// 채워야하는 갯수가 남았을때는 마지막과 비교해주면됨 !
if answer.last! < item {
answer.popLast()
answer.append(item)
}
}
}
return answer.map { String($0) }.joined(separator: "")
}
현재 코드의 문제
현재 코드는 한 번 비교해서 박혀있던 친구가 크면, 그대로 넘어가서 다음친구부터 비교해버리는데, 이러지말고 while문을 통해서 뿌리를 뽑아야했다.(끝까지 타고올라가면서 비교 판단) 대신, 지울 수 있는게 한정되어있으니 그거 잘 감안하면서 했어야했는데, 지운다는 것을 망각하고 그냥 지운만큼의 자릿수를 만드는데에 집중을 했던 것 같다.
힌트를 통해서 한번 크게 뒤어퍼서 다음과 같이 완성할 수 있었다.
완성코드
import Foundation
func solution(_ number: String, _ k: Int) -> String {
// 짤라주고 조인해서 INT()로 변환 ?
let digits = Array(number).compactMap { Int(String($0)) }
var answer: [Int] = []
// 남은 개수 확인하면서 비교
let LEN = number.count
let digitCount = LEN - k
var k = k
// LEN - idx => 남은 갯수
for item in digits {
while !answer.isEmpty && answer.last! < item && k > 0 {
answer.removeLast() // 뽑아쓸거아니면 removeLast() !
k -= 1
}
answer.append(item)
}
while k > 0 {
answer.removeLast()
k -= 1
}
return answer.map { String($0) }.joined(separator: "")
}
타인의 코드
import Foundation
func solution(_ number: String, _ k: Int) -> String {
var result: [Int] = []
var count: Int = 0
Array(number).compactMap { Int(String($0)) }.forEach { item in
while count < k {
if let last = result.last, last < item {
result.popLast()
count += 1
} else {
break
}
}
result.append(item)
}
return result[0..<(result.count - k + count)].map { "\($0)" }.joined()
}
나 처럼 이렇게 ! 안쓰고 if let으로 처리해준게 진짜 swift코드 같다고 잘 느껴졌다.
그리고 k를 깎는 것 대신에 반대로 count
를 더해주는 식으로 해주고 앞에서부터 k지운 자리수만큼 짤라준 것을 확인 할 수 있었다.