본문 바로가기

iOS 앱 개발자 프로젝트/알고리즘 코드카타

[Algorithm] 내 마음대로 정렬하기 (w/ Swift)

내 마음대로 정렬하기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

'인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.' 라는 문제 핵심을 잘 이해해야만 풀 수 있는 문제다. 은근히 문제 자체를 이해하기가 어렵다.. 

 

 

#1. 문자열 배열을 문자 단위로 분리하고 다시 배열로 변환:

var strings = strings.map { $0.map { String($0) } }

우선, 입력으로 받은 문자열 배열 strings의 각문자열을문자단위로분리한다. 내부의 .map { String($0) }은 각 문자를 다시 문자열로 변환하여, 결과적으로 각 문자열이 문자열 배열로 변환된다. ( ["abc", "def"]가 입력되면 [["a", "b", "c"], ["d", "e", "f"]]로 변환된다)

 

 

#2. 정렬 조건을 적용하여 배열 정렬:

strings.sort {
    if $0[n] == $1[n] {  //두 문자열의 n번째 문자가 같은지를 확인. 만약 같다면, 조건문 내부 코드 실행
        return $0.joined() < $1.joined() //각각 비교 중인 두 문자열 배열을 하나의 문자열로 합친 결과
    }
    return $0[n] < $1[n] //n번째 문자가 서로 다를 경우에 실행
}

정렬 조건을 적용하여 strings 배열을 정렬한다. 먼저, 두 문자열의 n번째 문자를 비교해야 하는데, $0[n]$1[n] 이 문자들이 같다면, 전체 문자열을 사전순으로 비교하여 정렬하고, $0.joined() < $1.joined() n번째 문자가 다르다면, 이 문자들을 기준으로 정렬한다. (sort 메소드는 배열 자체를 변경한다.)

 

 

#3. 정렬된 배열을 문자열로 변환하여 반환:

return strings.map { $0.joined() }

마지막으로, 정렬된 문자열 배열을 다시 전체 문자열로 변환하여 반환한다. 각 내부 배열을 .joined() 메소드를 사용하여 문자열로 합치고, 이를 새로운 배열로 만들어 반환해준다.

 

 

전체 코드 ▽

func solution(_ strings:[String], _ n:Int) -> [String] {
    var strings = strings.map { $0.map { String($0) } }
    
    strings.sort {
        if $0[n] == $1[n] {
            return $0.joined() < $1.joined()
        }
        return $0[n] < $1[n]
    }
    
    return strings.map { $0.joined() }
}