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

최근 글 👑

[Swift] Programmers - 제일 작은 수 제거하기

2024. 3. 8. 12:09ㆍIOS/Swift-Algorithm (Programmers)
SMALL

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

 

프로그래머스

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

programmers.co.kr

* 제일 작은 제거하기 *

정수를 저장한 배열, "arr" 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution 완성해주세요.

, 리턴하려는 배열이 배열인 경우엔 배열에 -1 채워 리턴하세요.

예를들어 "arr" [4,3,2,1] 경우는 [4,3,2] 리턴 하고, [10] [-1] 리턴 합니다.

* 제한사항 *

"arr"은 길이 "1" 이상인 배열입니다.

인덱스 i, j 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

* 알고리즘 분석과 이해 *

이 알고리즘은 주어진 배열에서 가장 작은 수를 제거하는 것입니다.

배열이 경우에는 -1 채워서 반환해야 합니다.

그러므로 주어진 배열에서 가장 작은 수를 찾아 제거하고,

만약 배열이 경우에는 -1 반환하면 됩니다.

* 로직구상 *

이 알고리즘의 로직을 구상하기 위해서는 

먼저 주어진 배열에서 최솟값을 찾고

해당 최솟값을 제거한 새로운 배열을 만들고

만약 새로운 배열이 비어있다면 "-1" 반환해줍시다.

 

그렇다면, 어떤 문법으로 코드를 구성하면 좋을지 생각해 봅시다.

먼저, 어진 배열에서 가장 작은 수를 제거하는 것이기 때문에

배열을 순회하면서 각 요소를 확인 해야 해서 반복문 (for-in)을 사용해야겠고,

배열에서 가장 작은수 즉, 최속값을 찾거나 특정 조건을 검사해야하니

조건문(if)을 사용해야할 것이고,

최솟값이나 특정 조건을 검사해야하니 비교연산자들도 사용될 것이고,

최솟값을 찾았으면 그 값을 제외한 나머지 요소들로 새로운 배열을 만들어야 하니까 
배열 필터링 (filter 함수)를 써서 
조건을 만족해주면 될 것 같습니다.

* 코드구성 *

func solution(_ arr: [Int]) -> [Int] {

함수 "solution" 정의해주고

[Int] 타입의 배열 "arr" 받아들여줍니다.

"arr" 주어진 배열을 나타내주죠

guard !arr.isEmpty else { return [-1] }

 배열에 -1 채워 반환하는 요구사항을 충족시켜주어야하니까

주어진 배열이 비어 있는지 확인하고, 만약 비어 있다면,

바로 "-1" 들어있는 배열을 반환하고 함수를 종료해주도록 코드를 짜줍시다.

var minValue = arr[0]

다음, 주어진 배열의 번째 요소를 최솟값으로 설정합니다.

배열의 모든 요소를 비교하며 최솟값을 찾아야 하므로,

일단 배열의 번째 요소를 초기 최솟값으로 설정해주고

for num in arr {
    if num < minValue {
        minValue = num
    }
}

이제 배열의 요소를 순회하면서,

현재까지의 최솟값보다 작은 값이 나타나면 최솟값을 해당 값으로 바꿔줍시다.

따라서 for 루프를 통해 배열에서 실제로 가장 작은 값을 찾습니다.

let result = arr.filter { $0 != minValue }

이제 최솟값을 찾았으니, 값을 제외한 나머지 요소들로 새로운 배열을 만들어야 하겠죠?!

때문에 "filter" 메서드를 사용해주도록 합시다.

"filter" 메서드는 주어진 조건에 따라 배열을 필터링하여 새로운 배열을 만듭니다.

여기서는 최솟값과 같지 않은 요소만을 남기기 위해 "$0 != minValue"라는 클로저를 사용하는데

여기서 $0 배열의 요소를 나타내며, != 연산자를 사용하여 최솟값과 같지 않은 요소들을 필터링해주는 역할을 해줍니다.

return result.isEmpty ? [-1] : result

마지막으로, 새로운 배열 result 비어있는지 확인하고, 비어있다면 "-1" 들어있는 배열을 반환합니다.

그렇지 않다면 실제로 필터링된 결과 배열을 반환해줍시다.

 

* 총코드 구성 *

func solution(_ arr: [Int]) -> [Int] {
    // 주어진 배열이 비어있는 경우 -1을 반환
    guard !arr.isEmpty else { return [-1] }
    
    // 배열에서 최솟값을 찾기 위해 첫 번째 요소를 최솟값으로 설정
    var minValue = arr[0]
    
    // 주어진 배열을 순회하며 최솟값 찾기
    for num in arr {
        if num < minValue {
            minValue = num
        }
    }
    
    // 최솟값을 제외한 새로운 배열 생성
    let result = arr.filter { $0 != minValue }
    
    return result.isEmpty ? [-1] : result
}
728x90