나름 Sorting이라 관련 이미지..
import Foundation
func solution(_ numbers: [Int]) -> String {
func mySorting(_ a: Int, _ b: Int) -> Bool {
if String(a).count == String(b).count {
return a > b
}
else {
return String(a) > String(b)
}
}
var k = numbers
k.sort(by: mySorting)
return k.map { String($0) }.joined()
}
결과
테스트 2 입력값 〉 [3, 30, 34, 5, 9] 기댓값 〉 "9534330" 실행 결과 〉 실행한 결괏값 "9534303"이 기댓값 "9534330"과 다릅니다.
이상한대로 나오는 결과값
나름 머리 써서 했었다. 둘이 길이가 같으면 숫자로 비교하고 , 그게 아닐 경우에는 String으로 아스키코드 값으로 판단해주면 나름 일관성있게 답이 나올지 알았는데
이게 3이 더 작은값으로 나오더라 그렇다고 숫자가 두자리까지만 있는게 아니라서 일일히 조건 주기에는 너무 코드가 장황해지고 실효성도 떨어질 것 같았다.
그래서 처음에는 이게 길이가 다른데, 첫 숫자가 같으면! 길이가 짧은애를 주자!
햇지만, 34, 3 ,30 중에 이게 34보다도 3이 먼저오는 불상사가 생겨서 아예 생각을 달리하던중에
343 > 334, 330,303 이렇게 생각하다보니 그냥 합친채로 비교해주면 되겠구나! 싶어서
합친 상태로 비교해주는 로직으로 mySort함수를 변경해주었다.
import Foundation
func solution(_ numbers: [Int]) -> String {
func mySorting(_ a: Int, _ b: Int) -> Bool {
let ab = "\(a)\(b)"
let ba = "\(b)\(a)"
return ab > ba
}
var k = numbers
k.sort(by: mySorting)
return k.map { String($0) }.joined()
}
Q : ab랑 ba는 INT로 바꿔서 비교해줘야 되는거 아니에요 ?
라고 생각을 했었다. "3" 과 "19"를 비교했을 때는 3이 더 크게 나오기 때문인데, 좀 더 깊게 생각해보니까 서로 같은 친구를 뭉쳐서 비교를 하는 것이다보니까 이런 변수는 생각을 안해도 되는 것이었다. 319 VS 193 이면 319가 사전상으로도 더 크게 나온다.
해결..인줄 알았는데
![]()
11번 테트스케이스에 대해서 찾아보니 [0,0,0,0]이 주어졌을 때 0000으로 출력을 하니까 실패한다고 한다. 예외처리를 해주면 될 것이다.
import Foundation
func solution(_ numbers: [Int]) -> String {
func mySorting(_ a: Int, _ b: Int) -> Bool {
let ab = "\(a)\(b)"
let ba = "\(b)\(a)"
return ab > ba
}
var k = numbers
k.sort(by: mySorting)
return k[0] == 0 ? "0" : k.map { String($0) }.joined()
}
정답
![]()
import Foundation
func solution(_ numbers: [Int]) -> String {
let sortedNumbers = numbers.sorted {
Int("\($0)\($1)")! > Int("\($1)\($0)")!
}
let answer = sortedNumbers.map { String($0) }.reduce("") { $0 + $1 }
return sortedNumbers.first == 0 ? "0" : answer
}
- 나는 joined를 사용했는데 reduce로 빈문자열서부터 다 더해준 방식이 신기했다.
- 나는 굳이 배열상태에서 [0]으로 했는데 .first쓴게 더 직관적인듯
- 이분은 Int()로 후에 탈없이 다 바꿔주신걸 확인할 수 있었는데, 나는 이럴 변수가 없다고 생각한 것 정도 차이가 있었다.