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

최근 글 👑

[Swift]Programmers - 나누어 떨어지는 숫자 배열

2024. 3. 4. 10:17ㆍIOS/Swift-Algorithm (Programmers)
SMALL

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

 

프로그래머스

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

programmers.co.kr

* 나누어 떨어지는 숫자 배열 *

array의 각 element 중 divisor로 나누어 떨어지는 값을

오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.

divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

* 제한사항 *

arr은 자연수를 담은 배열

정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j]

divisor는 자연수

array는 길이 1 이상인 배열

 

* 알고리즘 분석과 이해 *

이 알고리즘은 배열(arr)에서 "divisor"로 나누어 떨어지는 값들을 찾아서

오름차순으로 정렬한 배열을 반환하는 것이죠

그리고

만약 나누어 떨어지는 값이 하나도 없다면 -1을 반환해야 해요

 

* 로직구상 *

먼저 배열을 순회하면서 "divisor"로 나누어 떨어지는 값을 찾아야 하겠고

또 찾은 값을 다른 배열에 저장 해야하겠죠?!

그러기 위해서 반복문과 나머지 연산자 (%)의 쓰임을 생각해볼 수 있겠고

배열 선언을 통해 나누어 떨어지는 값을 추가하고 

저장된 배열을 오름차순으로 정렬하고 정렬된 배열을 반환해주면서

만약에 배열이 비어있다면 -1을 반환해주는 로직을 구상해보는데

이를 위해서 정렬 메서드를 사용하고

배열이 비어있는지 확인하기 위해서

"isEmpty" 프로퍼티를 사용해 볼 필요가 있습니다.

 

* 코드구성 *

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

정수 배열과 정수 하나를 받아줍니다.

정수 배열은 arr로, 정수 하나는 divisor로 받습니다.

반환값은 정수 배열입니다.

var result: [Int] = []

그리고

결과를 저장할 배열이 필요하기 때문에 "result"라는 이름의 빈 배열을 먼저 선언하고

이 배열에는 나누어 떨어지는 값을 저장할 예정입니다.

for num in arr {

그리고 입력된 배열(arr) 순회하며 요소를 가져올 것 입니다.

이렇게 하면 배열의 모든 요소를 확인할 있겠습니다.

 

if num % divisor == 0 {

그리고 배열의 요소를 "divisor" 나눈 나머지가 "0"인지 확인해주기 위해서

이렇게 함으로써 divisor 나누어 떨어지는 값인지 확인할 있습니다.

 

result.append(num)

나누어 떨어지는 값이라면, 해당 값을 결과 배열에 추가시켜주고

나누어 떨어지지 않는 값은 결과 배열에 추가되지 않게 해줍니다. 

 

여기서 사용된 append() 배열에 새로운 요소를 추가하는 메서드입니다.

메서드를 사용하면 배열의 끝에 원하는 값을 추가할 있게 됩니다.

이를 활용해서 결과 배열에 나누어 떨어지는 값들이 추가되는 것이죠.

 

result.sort()

 

"divisor"로 나누어 떨어지는 값들이 정렬된 상태로 저장될 수 있도록

모든 값이 추가된 결과 배열을 오름차순으로 정렬합니다.

 

여기서 사용된 "sort()" 배열을 정렬하는 메서드이며,

배열의 요소들을 원하는 순서로 재배치할 있습니다.

때문에 "divisor" 나누어 떨어지는 값들이

정렬된 상태로 저장되어 있는 배열을 얻을 수 있는 것 입니다.

return result.isEmpty ? [-1] : result

결과 배열이 비어있는지 확인하고

비어있다면, 문제에서 요구하는 대로 -1 포함한 배열을 반환하고

비어있지 않다면, 정렬된 결과 배열을 반환해줍니다.

 

여기서 ".isEmpty" 배열이 비어있는지 여부를 확인하는 프로퍼티이며

프로퍼티는 배열이 비어있으면 true 반환하고, 비어있지 않으면 false 반환합니다.

 

? 옵셔널 체이닝 연산자이죠

연산자를 사용해서 옵셔널 값이 nil 경우에도

안전하게 메서드나 프로퍼티에 접근할 있게 되는 것이죠.

 

따라서 result.isEmpty ? [-1] : result

result 배열이 비어있으면, 나누어 떨어지는 값이 하나도 없다면 [-1] 반환하고

"result" 배열이 비어있지 않으면, 나누어 떨어지는 값들이 오름차순으로 저장되어 있는 result 배열을 반환합니다.

 

총코드는 아래와 같습니다.

func solution(_ arr:[Int], _ divisor:Int) -> [Int] {
    // 나누어 떨어지는 값을 저장할 배열
    var result: [Int] = []
    
    // 배열을 순회하면서 나누어 떨어지는 값을 찾음
    for num in arr {
        if num % divisor == 0 {
            result.append(num)
        }
    }
    
    // 결과 배열을 정렬
    result.sort()
    
    // 결과 배열이 비어있는지 확인하여 -1 또는 정렬된 배열을 반환
    return result.isEmpty ? [-1] : result
}
728x90