티스토리 뷰
728x90
1. 적용 알고리즘과 문제 설명
그리디 문제
정수로 된 문자열이 주어지고, 자연수 k가 주어지면
정수 문자열에서 k개의 문자를 제거하여 얻을 수 있는 수 중 가장 큰 수를 구하는 문제
문자열에서 문자를 제거하는 것이기 때문에 문자열의 순서는 보존되어야 한다.
접근방법
큰 수를 얻는게 목적인 만큼, 앞자리 수가 커야한다.
스택 하나를 두고, k개의 카드(앞으로 문자를 제거하는 걸 카드라고 표현한다)가 남아있는 한
새로 들어갈 수가 현재 스택의 맨 위의 수보다 커야한다.는 로직이면
가장 큰 수를 얻을 수 있다.
2. 코드에 대한 설명
이걸 코드로 설명하면
k가 0보다 클 때까지는, 스택의 맨 위의 수 >= 새로 들어갈 수 를 만족할 때 까지 스택에서 원소를 뺀다. 그리고 뺄 때마다 k를 1감소 시킨다.
import Foundation
func solution(_ number:String, _ k:Int) -> String {
var answer = ""
var _k:Int = k // k를 감소시키기 위해 변수로 선언
let numbers:[Character] = Array(number) // swift 문자열은 서브스크립트를 제공하지 않기 때문에 편의상 배열로 변환
let n:Int = numbers.count
var stack:[Character] = []
for (i,num) in numbers.enumerated() {
// 스택에서 값을 빼내는 반복문
while !stack.isEmpty && _k > 0 &&
stack.last!.wholeNumberValue! < num.wholeNumberValue! {
stack.removeLast()
_k -= 1
}
// 정해진 길이를 넘지 않는다면 stack에 append
if stack.count < n-k {
stack.append(num)
}
}
return String(stack)
}
3. 시간 복잡도, 공간 복잡도 계산
시간 복잡도 : O(n)
while 문의 반복횟수 : 프로그램 실행 동안 최대 k번 (k번만 뺄 수 있으므로)
append 실행 횟수 : 최대 n번
k < n 이므로 약 2n
append()와 removeLast()는 O(1)
공간 복잡도 : O(n)
스택의 최대 크기는 n-k개. 1 <= k < n 이므로 스택에 최대로 들어갈 수 있는 원소의 개수는 n-1개
4. 사용 라이브러리
Array의 메서드
- append(Character) : O(1)
- removeLast() : O(1)
5. 문제 풀이에 어려웠던 점
스택을 사용하는 로직을 생각해내는 것이 어려웠다.
마지막에 스택의 크기를 제한하지 않았다.
9991, K=2 와 같은 반례를 통해서 문제를 발견하여 해결했다.
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] k진수에서 소수 개수 구하기 (Swift) (0) | 2022.03.08 |
---|---|
[프로그래머스] 신고 결과 받기 (Swift) (0) | 2022.03.08 |
[프로그래머스] 빛의 경로 사이클 (C++) (0) | 2022.03.05 |
[프로그래머스] 소수찾기 (Swift) (0) | 2022.03.05 |
[프로그래머스] 멀쩡한 사각형 (Swift) (0) | 2022.03.03 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스택
- Swift
- 브루트포스
- 백트래킹
- 게임이론
- 그리디알고리즘
- 투포인터
- 자바
- 알고리즘
- 가장 큰 수 Swift
- 우선순위큐
- 다이나믹프로그래밍
- 웹크롤링
- 수학
- dfs
- 프로그래머스
- 파이썬
- 이분탐색
- BFS
- 백준
- c++
- 트리
- 동적계획법
- 최대힙
- dp
- 정렬
- 최단경로
- 토마토
- 가장 큰 수 프로그래머스
- 최소힙
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함