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
}
'IOS > Swift-Algorithm (Programmers)' 카테고리의 다른 글
[Swift] Programmers - 수박수박수박수박수박수? (0) | 2024.03.12 |
---|---|
[Swift] Programmers - 가운데 글자 가져오기 (0) | 2024.03.11 |
[Swift] Programmers - 없는 숫자 더하기 (0) | 2024.03.07 |
[Swift] Programmers - 핸드폰 번호 가리기 (0) | 2024.03.06 |
[Swift]Programmers - 음양 더하기 (2) | 2024.03.05 |