본문 바로가기
Xcode/Swift - Algorithm

Swift) 프로그래머스(Lv1) 문자열 내 마음대로 정렬하기 (Sort)

by 후르륵짭짭 2020. 7. 7.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/12915

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1�

programmers.co.kr

안녕하세요!!! 후르륵짭잡 입니다.

이번에는 정렬을 배워 보려 합니다.

Swift에서 마음대로 정렬하기 위해서는 Sorted를 알아야합니다.

처음에는 sorted를 알았지만 방식을 잘 몰랐기 때문에 결국 삽입정렬로 풀었습니다.

func solution(_ strings:[String], _ n:Int) -> [String] {
    
    var answer : [String] = []
    
    for index in 0..<strings.count {
            
        let indexElement = Array(strings[index])
        
        var start = answer.count - 1
        
        answer.append(strings[index])
        
        while start >= 0 {
            
            let startElement = Array(answer[start])
            
            if indexElement[n] < startElement[n] {
                 answer[start + 1] = answer[start]
             }
             else if indexElement[n] == startElement[n] && strings[index] < answer[start]{
                 answer[start + 1] = answer[start]
             }
             else{
                 break
             }
            
            start -= 1
            
        }
        
        answer[start + 1] = strings[index]

    }
    
    
    return answer
}

 근데,,,, 이런 방법은 O(N^2)이기 때문에 매우 비효율적입니다.

 

결국 Sorted 방식을 분석하기로 했습니다.

처음에 Sorted를 사용하니 " < " 은 작은 것이 앞으로 (오름차순)

" > "은 작은 것이 뒤쪽으로 (내림차순) 정렬이 됩니다.

또한 시간 복잡도는 O(nLog^n)이 된다고 합니다.

 

이 문제를 풀 때, 처음에는 

func WrongSolution(_ strings:[String], _ n:Int) -> [String]{
    
    return strings.sorted { (index1, index2) -> Bool in
        
        let elementArray1 = Array(index1)
        let elementArray2 = Array(index2)
        
        if elementArray1[n] == elementArray2[n] {
            return index1 < index2
        }
        else if elementArray1[n] < elementArray2[n]{
            return index1 < index2
        }

        return index1 > index2
    }
    
}

이 코드 처럼 모든 상황에 대해서 다 나눠주었는데,,, 적용이 되지 않았다.

오히려 코드를 

func WrongSolution(_ strings:[String], _ n:Int) -> [String]{
    
    return strings.sorted { (index1, index2) -> Bool in
        
        let elementArray1 = Array(index1)
        let elementArray2 = Array(index2)
        
        if elementArray1[n] == elementArray2[n] {
            return index1 < index2
        }
      
        return elementArray1[n] < elementArray2[n]
    }
    
}

이렇게 간출였더니 오히려 정답이였다.

그리고 새로운 것을 테스트 해봤다.

struct Info {
    let name : String
    let age : Int
}

let list = [Info(name: "a", age: 12),Info(name: "b", age: 12),Info(name: "c", age: 42),Info(name: "d", age: 64),Info(name: "e", age: 12),Info(name: "f", age: 15)]

func sortSolution(_ list : [Info]) -> [Info]{
    
    return list.sorted { (element1, element2) -> Bool in
        
        if element1.age == element2.age{
            return element1.name < element2.name
        }
        else if element1.age < element2.age{
            return element1.name < element2.name
        }
        
        return element1.age > element2.age
    }
    
}

print(sortSolution(list))

이 코드를 돌렸는데, 여전히 else if 부분이 작동 되지 않았다.

이것을 보아 조건문에서는 == 부분만 케이스를 나눠줘야하고

상하 비교문은 조건을 나눠주는 것이 아니라 기본적으로 오른차순을 할 것인지 아니면 내림차순을 할 것인지

하나만 정해줘야 하는 것 같다.....

 

그런데,,,

func RightSolution(_ strings:[String], _ n:Int) -> [String]{
    
    return strings.sorted { (index1, index2) -> Bool in
     
        if Array(index1)[n] == Array(index2)[n] {
           
            return index1 < index2
        }
        else if Array(index1)[n] < Array(index2)[n] {
            
            return Array(index1)[n] < Array(index2)[n]
        }

            return false
    }
    
}

이렇게 하니 비교 연산자를 주었는데 되었다!

developer.apple.com/documentation/swift/array/2296815-sorted

불러오는 중입니다...

애플 공식 문서를 보니

첫 번째 인수를 두 번째 인수보다 먼저 정렬해야하는 경우 true를 리턴하는 술어. 그렇지 않으면 false입니다.

그러니 앞과 뒤를 비교할 때 비교 연산자를 선택하는 것 보다는 true 와 false를 사용하는게 맞는 거 같다.

 

일단 정리하자면

1) 기본적으로 오름차순 정렬인지 내림차순 정렬인지 정하고 마지막 return 부분에 기본적인 정렬 방식을 넣어준다

2) 아니면 모든 부분에 비교 연산자를 넣어주지만 true, false로 나눠줘야한다.

728x90
반응형

댓글