https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문자열에서 숫자를 뽑아내서 각 숫자의 개수가 많은 순서대로 배열에 넣어주면 된다!
문자열에 대한 구현을 제대로 할 수 있는지에 대해 묻는 문제 같다.
[내 코드]
import Foundation
func solution(_ s:String) -> [Int] {
var dictionary = [Int:Int]()
var tuple = [Int]()
var tmp = ""
for str in s {
if String(str) == "}" || String(str) == "," {
if tmp != "" {
tuple.append(Int(tmp)!)
tmp = ""
}
}
if str.isNumber {
tmp += String(str)
}
}
for element in tuple {
dictionary[element] = (dictionary[element] ?? 0) + 1
}
let sortedDictionary = dictionary.sorted { elem1, elem2 in
return elem1.value > elem2.value
}
return sortedDictionary.map { $0.key }
}
문자열에서 숫자를 뽑아내서 개수를 따라 출력하는 것은 쉬운데
그 숫자를 뽑아내는 게 좀 골치 아팠다.
tmp에 숫자인 문자를 넣고 } 혹은 , 를 만나면 tmp를 tuple에 넣어줬다.
그 후, dictionary에 넣어서 개수를 따로 누적했고 정렬해서 결괏값을 출력했다.
다른 분의 코드를 보는데 엄청난... 코드를 봤다.
바로, split 혹은 component를 사용해서 문자열을 나눴다.
s.removeFirst(2)
s.removeLast(2)
s.components(separatedBy: "},{")
.map { $0.components(separatedBy: ",").map { Int(String($0))! }
.sorted { $0.count < $1.count }
.forEach {
$0.forEach {
if !answer.contains($0) {
answer.cappend($0)
}
}
}
}
ex) "{{1,2,3}, {2,1}, {1,2,4,3}, {2}}" → "1,2,3}, {2,1}, {1,2,4,3}, {2"
맨 처음에 "}, {"를 기준으로 나누고 ", "를 기준으로 나눠줬다.
→ 1,2,3 / 2,1 / 1,2,4,3 / 2
→ 1 / 2 / 3 / 2 / 1 / 1 / 2 / 4 / 3 / 2
여기서 놀란 게...
sorted에서 바로 $0.count < $1.count를 해줬다는 것이다..!
이렇게 되면 중복 값이 나오는데, 그래서 그런지 밑에서 contains 함수를 사용해서 중복을 제거해 줬다.
뭔가.. 나였다면 헷갈려서 한번 끊었을 거 같다.ㅋㅋㅋㅋ
대단한 사람들.. 나도 이렇게 고차함수를 잘 사용해야겠다~
+ Swift 이차원 배열에는 크기가 다른 1차원 배열이 들어갈 수 있다! 최고다~
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Swift] 귤 고르기 (0) | 2023.01.03 |
---|---|
[프로그래머스/Swift] n^2 배열 자르기 (0) | 2023.01.01 |
[프로그래머스/Swift] 괄호 회전하기 (0) | 2022.12.29 |
[프로그래머스/Swift] 예상 대진표 (0) | 2022.12.28 |
[프로그래머스/Swift] 영어 끝말잇기 (0) | 2022.12.28 |