-
큰 수 만들기(그리디, 탐욕법)[프로그래머스].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을 사용해 옵셔널과 관련해 코드가 훨씬 깔끔하고 안전하게 바뀌었다.
'알고리즘관련 > 문제풀이' 카테고리의 다른 글
2667. 단지번호붙이기.swift (0) 2023.04.05 BOJ_2661.좋은수열.swift (0) 2023.04.05 [백준 23257번]비트코인은신이고나는무적이다.py (0) 2021.12.26 백준)11000_강의실 배정.python (0) 2021.07.25 [백준 2156번]포도주 시식 (0) 2021.07.05 - compactMap