TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 튜플

여의도사노비 2023. 1. 6. 17:43
728x90

이 문제는 일단 문제 자체를 이해하는데 꽤나 오랜 시간이 걸렸다.

문제를 이해하기 위해 노력하다가 중간에 딴 길 새서 유튜브로 시간을 날렸다... 진짜 화가남...

결국 원래 문제의 목적에 맞게 이해했는지는 모르겠지만 답은 나왔다.

카카오 코테 문제 통과하면 은근 기분 좋다 ㅎ

 

내가 처음에 이해 못한 문제의 내용은 

위 사례 중 3번째 사례가 왜 되는건지 였다. 저렇게 나온다면 return 받을 배열의 모습을 어떻게 알지... 2143이 될지 4123이 될지 어떻게 알아? 였다. 그런데 그게 중요한게 아니었던 것 같다. 결국 잘보면 모든 사례에서 2가 가장 많이 등장하고 4가 가장 적게 등장한다. 이는 결국 2...4 순서로 나오는 return 값과도 일치한다. 나는 이렇게 빈도수에 따른 return 배열 순서라고 이해했다.

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 결국 주어진 String 내에서 각 값의 빈도수가 중요하기 때문에
  2. 값을 전부 arrS에 깔끔하게 정리해놨다.
  3. 그 값을 dictionary를 이용해서 각 키마다 몇번 언급되었는지 확인하였고
  4. 마지막으로 value 값을 기준으로 key값을 순서 정리하였다.
  5. 그리고 그 순서대로 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)

  1. String -> Array, Array -> String으로 바꾸는 작업들을 최대한 줄이는 것이 비용 절약에 좋은 것 같다. 처음부터 String으로 주어졌다면 String 내에서 최대한 해결하고 Array에 append하는 일들은 줄이는 연습을 많이 해야겠다.
  2. sorted를 오랜만에 사용했는데 $0.1 처럼 키와 밸류를 구분해서 클로저 사용하는 것이 굉장히 유용하다고 느꼈다. 분명 예전에 백준 문제 풀때도 이런 비슷한 코드를 많이 사용했었는데 역시나 까먹은 것 같다. sorted는 앞으로 더 자주 유용히 쓸 수 있게 자주 사용해야할 것 같다.