알고리즘/프로그래머스

[프로그래머스/Swift] 튜플

녕이 2022. 12. 29. 16:41
728x90

 

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차원 배열이 들어갈 수 있다! 최고다~

 

 

 

728x90