[Swift] [12일차] 큰 수 만들기

·2024년 12월 19일
0

SwiftAlgorithm

목록 보기
15/105
post-thumbnail

Programmers-큰수만들기

문제 설명

number 들어오는거에서 k개 만큼 숫자 지웠을 때 가장 큰 수 구하기


풀이과정

  1. 완탐은 아닌 것 같다. 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지운 자리수만큼 짤라준 것을 확인 할 수 있었다.

profile
기억보단 기록을

0개의 댓글