티스토리 뷰
안녕하세요. 밀쿄입니다.
오늘은 문제하나를 들고왔습니다.
풀다보니 이건 기록을 해야겠다 싶어서 포스팅을 해봅니다.
https://programmers.co.kr/learn/courses/30/lessons/42883
이 문제 입니다.
문제의 지문을 이해하기엔 크게 어려움이 없는 문제입니다.
문제의 요지는 k개 수를 제거했을 때 얻을 수 있는 가장 큰 수를 구하는 것 입니다.
먼저 예제를 보면
1924는 두 개의 수를 제거하여 19, 12, ,14, 92, 94 , 24 정도를 만들 수 있는데 94가 제일 크니 94가 답이 된다고 합니다.
여기서 오해했던게 1924에서 제일 큰 수 두개가 보다시피 9, 4 입니다.
그래서 큰 수를 순서대로 뽑는 건가 싶었습니다.그래서 정렬해서 풀었습니다... 물론 오답이었지만요..
그치만 다음 예제를 보면 1231234 입니다.
여기서 4가 제일 큰 수이지만 4를 뽑으면...그 다음 3이 뽑히고 그런 문제인줄 알았는데..
아니었습니다...
말그대로 숫자의 순서는 바꿀 수 없고 k갯수만큼 제거해서 만들 수있느 제일 큰 수를 찾는 것 입니다.
문제는 여기서 K수 만큼 제거하고 남은 글자수에 너무 집중해서 처음에 코드가 엄청 이상했습니다.
글자수가 되면 반복문을 종료시킬려고 하거나.. 등등 글자수에 포커스를 맞추니 문제가 안풀렸습니다.
하지만 문제를 다시 읽어보니 k개 수를 제거했을 때 얻을 수 있는 가장 큰 수입니다.
즉 앞에서부터 순회하면서 k를 줄여나가는 방식으로 방법을 전환하고 삽질을 그만 들 수 있었습니다.
즉, 배열 하나에 주어진 숫자를 하나하나 넣으면서 마지막값보다 큰 수가 들어오면 계속해서 삭제하고 k값을 감소 시켜 주면 됩니다.
while !temp.isEmpty && Int(temp.last!)! < Int(String(num))! && cK > 0 {
temp.removeLast()
cK -= 1
}
이렇게 반복을 돌다가 k값이 0 이 되면 남은 글자를 다 넣어주고 일단 반복을 종료합니다.
if cK == 0 {
let sindex = number.index(number.startIndex, offsetBy: index)
let str = String(number[sindex ..< number.endIndex])
temp.append(str)
break
}
하지만 k가 0이 되기전에 반복이 끝날 수도 있으니 k 값이 0 인지 체크하고 0이 아니면 나와야하는 글자수만큼 잘라줍니다.
if cK > 0 {
result = temp[0 ..< temp.count - cK].joined()
} else {
result = temp.joined()
}
끝입니다.
처음접근을 너무 어렵게 생각해서
더 어려웠던 문제였던것 같습니다.
다음에는 다른문제로 또 나타나겠습니다.
'자료구조' 카테고리의 다른 글
유니온 파인드(Union-Find) (1) | 2020.05.25 |
---|---|
[프로그래머스] 프린터 (0) | 2020.04.06 |
[프로그래머스] 2016 with Swift (0) | 2020.03.30 |
[Swift] 이진 탐색 트리 (0) | 2020.01.15 |
[Swift] 이진 트리 (0) | 2019.12.27 |
- Total
- Today
- Yesterday
- combine
- 스유
- 유니온파인드
- 결합연산자
- CombineLatest
- Apple
- BBIK
- 자료구조
- compactMap
- 스택뷰
- Queue
- 스위프트
- 콤바인
- 현업이그리운
- MVC
- 삨
- UIViewControllerRepresentable
- SwiftUI
- 스위프트유아이
- replaceNil
- Just
- AutoLayout
- 텔큐온
- swift
- iOSCombine
- SEQUENCE
- ErrorHandling
- programmers
- ios
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |