2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Swift] Programmers - 문자열 내림차순으로 배치하기

2024. 3. 15. 10:41ㆍIOS/Swift-Algorithm (Programmers)
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/12917

 

프로그래머스

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

programmers.co.kr

* 문자열 내림차순으로 배치하기 *

문자열 "s"에 나타나는 문자를 큰것부터 작은 순으로 정렬새로운 문자열을 리턴하는 함수, solution을 완성하라.

"s" 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 으로 간주.

* 제한사항 *

"str" 길이 1 이상인 문자열

* 알고리즘 분석과 이해 *

이 알고리즘은 주어진 문자열을 내림차순으로 정렬하는 알고리즘입니다.

대문자는 소문자보다 작은 것으로 간주되니까 대소문자를 모두 고려하여 문자열을 정렬해야 하는 문제죠.

* 로직구상 *

먼저, 주어진 문자열을 정렬할 때, 대문자와 소문자를 모두 고려하여

대소문자가 섞여 있더라도 정렬할 수 있어야 합니다.

따라서 우선 대문자와 소문자를 구분하지 않고 문자열을 정렬한 후,

대문자가 소문자보다 작은 것으로 간주되어 정렬된 문자열을 반환하면 되겠죠.

* 생각해보기 *

👇🏻 문자열 "s"를 문자 단위로 분리해서 배열로 만들어 보는 방법 👇🏻

"Array" 타입을 사용해서 문자열을 문자 단위로 분리해 배열로 변환 시켜봅시다.

(각 문자를 개별적으로 처리할 수 있어 정렬 과정에서 편리함)

 

👇🏻 문자 정렬 👇🏻

문자 배열을 정렬하는 과정에서 대문자가 소문자보다 작은 것으로 간주하여 정렬

 

👇🏻 sorted(by:) 메서드를 사용하여 배열을 정렬 👇🏻

클로저를 사용하여 두 개의 문자를 비교하고, 대문자와 소문자를 구분하여 정렬 순서를 결정

(대문자와 소문자를 모두 고려하여 문자열을 정렬)

 

👇🏻 정렬된 문자 배열을 다시 문자열로 변환하여 반환하기 👇🏻

정렬된 문자 배열 sortedCharacters를 다시 문자열로 변환하여 반환

 

"String 이니셜라이저"를 사용하여 배열을 문자열로 변환

(정렬된 문자열을 함수의 반환 값으로 사용)

* 코드구성 *

func solution(_ s: String) -> String {

 

먼저, 문자열 "s"를 받아서 문자열로 반환하는데

(_ s: String) 하나의 인자를 받으며, 해당 인자는 이름이 "s"이고 타입은 "String"으로 정의해줍시다.

그리고 "solution"은 "String" 타입을 반환 하도록 해줍시다.

let characters = Array(s)

 

다음으로, 문자열 "s"를 "Array"타입을 사용하여

문자 단위로 분리하여 배열로 만들어주고

let sortedCharacters = characters.sorted { (char1, char2) -> Bool in

"characters" 배열을 정렬해서 "sortedCharacters"에 할당해줍시다.

정렬 방식은 클로저를 사용하여 지정해주고

정렬 클로저는 두 개의 문자(char1과 char2)를 받아서

불리언 값을 반환하도록 구성해줍시다.

if char1.isUppercase != char2.isUppercase {
    return char1.isLowercase
}

두 문자 중 하나가 대문자이고 다른 하나가 소문자인지를 확인해주도록 구성해주고

대소문자가 다르다면, 대문자가 소문자보다 작은 것으로 간주해서

"char1"이 소문자인지 여부를 반환하도록 해줍시다.

("sorted" 함수에 의해 정렬 순서를 결정하는 데 사용)

	return char1 > char2
  }

대소문자가 같은 경우, 두 문자를 비교하여 일반적인 내림차순으로 정렬 하도록 해주고

" > "연산자는 "ASCII 값"에 기반하여 문자를 비교해주는데

문자가 크다는 것은 해당 문자의 "ASCII 값"이 더 크다는 것을 의미하겠죠.

	return String(sortedCharacters)
}

정렬된 문자 배열 "sortedCharacters를 다시 문자열로 변환하여 반환하면

내림차순으로 정렬된 문자열이 반환되며 마무리됩니다.

*전체 코드 구성*

func solution(_ s: String) -> String {
    // 문자열을 문자 단위로 분리하여 배열로 만듭니다.
    let characters = Array(s)
    
    // 문자를 정렬합니다. 이 때 대문자가 소문자보다 작은 것으로 간주하여 정렬합니다.
    let sortedCharacters = characters.sorted { (char1, char2) -> Bool in
        // 대문자가 소문자보다 작은 것으로 간주하여 정렬합니다.
        if char1.isUppercase != char2.isUppercase {
            return char1.isLowercase
        }
        
        // 대소문자가 같으면 일반적으로 문자열을 내림차순으로 정렬합니다.
        return char1 > char2
    }
    
    // 정렬된 문자 배열을 다시 문자열로 변환하여 반환합니다.
    return String(sortedCharacters)
}

여담이지만.. 이번 알고리즘을 풀면서..

유난히 이번 알고리즘은 생각보다 어려웠다고 느껴졌네요..

728x90