▼ 문제 링크
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
# 풀이 1
내장 정렬 함수를 사용하지 않는 방법 시도
import Foundation
func solution(_ numbers:[Int]) -> String {
var nums = [[String]]()
var result = ""
// [Int] -> [String]
for number in numbers {
nums.append(String(number).map{String($0)})
}
while !nums.isEmpty {
var first = 0 // 가장 큰 첫번째 숫자
var largest = [[String]]()
// 가장 큰 첫번째 숫자 구하기
for num in nums {
first = (Int(num[0])! > first ? Int(num[0])! : first)
}
// 첫번째 숫자가 같은 수가 여러개일 때
for (index, num) in nums.enumerated() {
if Int(num[0])! == first {
largest.append(num)
nums[index] = ["-1"]
}
}
nums = nums.filter { $0 != ["-1"] }
// 해당 첫번째 숫자를 가진 수가 하나일 때
if largest.count == 1 {
for value in largest[0] {
result += value
}
continue
}
// 첫번째 수가 같은 숫자들 순서 정하는 로직 구현 필요
}
return result
}
처음엔 sort(), sorted()같은 정렬 함수를 쓰지 않고 구현해야 하는 줄 알아서 구구절절 코드가 길어졌다.
[92, 55, 10] 처럼 첫번째 수가 전부 다 다른 경우에는 해당 로직으로 답을 구할 수 있지만, [30, 32, 3, 58, 67]처럼 앞자리가 3인 수가 여러개일 경우 비교하는 로직을 구현하지 못했다.🥲
꽤 오랜 시간 붙들고 있었지만, 결국 해결하지 못하고 집단 지성의 힘을 빌림
# 풀이 2
내장 함수 사용 및 숫자를 표현한 String의 특성
import Foundation
func solution(_ numbers:[Int]) -> String {
// Int -> String으로 변환
var nums = numbers.map { String($0) }
// 두 숫자를 합쳐서 더 큰 숫자가 되는 걸 앞에 배치
nums.sort { $0+$1 > $1+$0 }
// [0, 0, 0]경우 "000"으로 표기되므로 "0"으로 반환
if nums[0] == "0" {
return "0"
}
// 배열을 풀어서 하나의 String으로 반환
return nums.joined()
}
해답은 생각보다 훠어얼씬 짧고 간단했다.
내장 정렬 함수를 쓰되, 단순 크기 비교가 아니라 합쳤을 때 더 큰 수를 어떻게 구하는지 궁금했는데 nums.sort { $0+$1 > $1+$0 } 이런 방법이 있었다.
다른 언어에서는 어떨지 모르겠는데, Swift에서는 숫자를 문자로 표현했을 때 문자를 숫자처럼 비교할 수 있다.
var num1: String = "12"
var num2: String = "64"
// "num1 is smaller than num2"
print((num1 > num2 ? "num1 is bigger than num2" : "num1 is smaller than num2"))
이런식으로 num1과 num2가 String 타입이어도 숫자처럼 비교할 수 있다.
sort()를 단순히 오름차순, 내림차순으로 정렬할 때만 사용했는데, 이런식으로도 활용이 가능하다는 걸 배웠다.
아직 갈 길이 멀구나
'Algorithm' 카테고리의 다른 글
[프로그래머스] 멀쩡한 사각형 - 최대공약수 구하기 (0) | 2021.07.27 |
---|---|
[코딜리티] MaxDoubleSliceSum (0) | 2021.07.23 |
[코딜리티] Stone Wall - Stack과 Queue (0) | 2021.07.01 |
[프로그래머스] 짝지어 제거하기 - 효율성 통과하기 (0) | 2021.06.29 |
[코딜리티] Tape Equilibrium - 시간 복잡도 줄이기 (0) | 2021.06.13 |