ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 큰 수 만들기(그리디, 탐욕법)[프로그래머스].swift
    알고리즘관련/문제풀이 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을 사용해 옵셔널과 관련해 코드가 훨씬 깔끔하고 안전하게 바뀌었다.

Designed by Tistory.