알고리즘관련/문제풀이

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