728x90
이 문제는 일단 문제 자체를 이해하는데 꽤나 오랜 시간이 걸렸다.
문제를 이해하기 위해 노력하다가 중간에 딴 길 새서 유튜브로 시간을 날렸다... 진짜 화가남...
결국 원래 문제의 목적에 맞게 이해했는지는 모르겠지만 답은 나왔다.
카카오 코테 문제 통과하면 은근 기분 좋다 ㅎ
내가 처음에 이해 못한 문제의 내용은
위 사례 중 3번째 사례가 왜 되는건지 였다. 저렇게 나온다면 return 받을 배열의 모습을 어떻게 알지... 2143이 될지 4123이 될지 어떻게 알아? 였다. 그런데 그게 중요한게 아니었던 것 같다. 결국 잘보면 모든 사례에서 2가 가장 많이 등장하고 4가 가장 적게 등장한다. 이는 결국 2...4 순서로 나오는 return 값과도 일치한다. 나는 이렇게 빈도수에 따른 return 배열 순서라고 이해했다.
이 문제를 풀면서 생각한 논리적 흐름
- 결국 주어진 String 내에서 각 값의 빈도수가 중요하기 때문에
- 값을 전부 arrS에 깔끔하게 정리해놨다.
- 그 값을 dictionary를 이용해서 각 키마다 몇번 언급되었는지 확인하였고
- 마지막으로 value 값을 기준으로 key값을 순서 정리하였다.
- 그리고 그 순서대로 arr에 key값을 배열하였다.(그럼 결국 빈도수가 높았던 key 값대로 배열이 되고 return 값에 부합한다.)
* 코드
import Foundation
func solution(_ s:String) -> [Int] {
var dict: [String: Int] = [:]
var stringS = s
var ans: [Int] = []
stringS = stringS.replacingOccurrences(of: "{", with: "")
stringS = stringS.replacingOccurrences(of: "}", with: "")
let arrS = stringS.components(separatedBy: ",")
for i in arrS {
if dict[i] != nil {
dict[i]! += 1
} else {
dict[i] = 1
}
}
let sortedDict = dict.sorted{ $0.1 > $1.1 }
for i in sortedDict {
ans.append(Int(i.key)!)
}
return ans
}
정리(Today I Learned)
- String -> Array, Array -> String으로 바꾸는 작업들을 최대한 줄이는 것이 비용 절약에 좋은 것 같다. 처음부터 String으로 주어졌다면 String 내에서 최대한 해결하고 Array에 append하는 일들은 줄이는 연습을 많이 해야겠다.
- sorted를 오랜만에 사용했는데 $0.1 처럼 키와 밸류를 구분해서 클로저 사용하는 것이 굉장히 유용하다고 느꼈다. 분명 예전에 백준 문제 풀때도 이런 비슷한 코드를 많이 사용했었는데 역시나 까먹은 것 같다. sorted는 앞으로 더 자주 유용히 쓸 수 있게 자주 사용해야할 것 같다.
'TIL > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 Lv. 2 Swift 알고리즘 - n^2 배열 자르기 (0) | 2023.01.08 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 기능개발 (0) | 2023.01.08 |
프로그래머스 Lv. 2 Swift 알고리즘 - 위장 (0) | 2023.01.06 |
프로그래머스 Lv. 2 Swift 알고리즘 - 괄호 회전하기 (0) | 2023.01.05 |
프로그래머스 Lv. 2 Swift 알고리즘 - 행렬의 곱셈 (0) | 2023.01.05 |