728x90
머릿속으로는 알고리즘이 뻔히 보이는데... 막상 구현하려니 코드가 점점 복잡해져서 고생한 문제이다.
심지어 시간 제한을 맞추는 것도 꽤나 빡셌다...
문제 자체는 간단하다. 두 배열 간 공통으로 쓰이는 원소들을 다시 재조합하여 가장 큰 숫자를 만드는 문제이다.
이 문제를 풀면서 생각한 논리적 흐름
- X에 있는 원소와 Y에 있는 원소들 중 어떤 원소들이 겹치는지 확인한다.
- 겹친 원소들이 X와 Y에 각각 몇개씩 있는지 확인한다.
- 이렇게 dictX, dictY에 각 숫자를 Key로, 숫자의 빈도를 value로 둔다.
- 결국 가장 큰 수를 만들기 위해서는 1~9 사이의 숫자 중 가장 큰 숫자인 9부터 앞자리에 위치하면 된다.
- dictX, dictY에서 9가 두세번씩 공통으로 등장하는 경우도 있을 수 있기 때문에
- "9876543210"의 범위 값인 i가 최소 몇번 등장하는지를 나타내는 minCount를 구한다.
- 그 minCount만큼 i를 반복해서 answer string에 더해준다.
- 공통된 값이 없거나 0만 겹쳤을 경우도 대비하여 if문을 설정한다.
* 코드
import Foundation
func solution(_ X:String, _ Y:String) -> String {
var dictX = [Character: Int]()
var dictY = [Character: Int]()
var answer = ""
for i in X {
let count = dictX[i] ?? 0
dictX[i] = count + 1
}
for i in Y {
let count = dictY[i] ?? 0
dictY[i] = count + 1
}
for i in "9876543210" {
let minCount = min(dictX[i] ?? 0, dictY[i] ?? 0)
for _ in 0..<minCount {
answer.append(i)
}
}
if answer.isEmpty {
return "-1"
} else if answer.first == "0" {
return "0"
} else {
return answer
}
}
정리(Today I Learned)
- 원래 else if answer.first == "0" 이 부분을 else if answer.prefix(1) == "0" 이렇게 풀었었다.
- 하지만 놀랍게도 (좌)결과는 통과, (우)결과는 테스트7 런타임 에러가 발생했다.
- first와 prefix(1)의 차이는 단순 에러 뿐만 아니라 실행 결과의 속도 전체를 비교해봤을때도 꽤나 큰 차이가 난다.
- 나는 사실상 이 두개를 그렇게 의미있게 차이를 두고 있지 않았는데... 컴퓨터는 정말 다르게 인식하나보다.
- 이런 함수 하나하나의 활용이 코스트에 많은 영향을 미친다는 것을 다시 한 번 느낀 알고리즘 문제였다.
'TIL > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 Lv. 2 Swift 알고리즘 - 영어 끝말잇기 (0) | 2023.01.01 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 짝지어 제거하기 (0) | 2023.01.01 |
프로그래머스 Lv. 1 Swift 알고리즘 - 삼총사 (0) | 2023.01.01 |
프로그래머스 Lv. 1 Swift 알고리즘 - 콜라 문제 (0) | 2022.12.30 |
프로그래머스 Lv. 1 Swift 알고리즘 - 옹알이(2) (0) | 2022.12.30 |