https://school.programmers.co.kr/learn/courses/30/lessons/76501
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
* 음양 더하기 *
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은
정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은
불리언 배열 signs가 매개변수로 주어집니다.
실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
* 제한사항 *
absolutes의 길이는 1 이상 1,000 이하입니다.
absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
signs의 길이는 absolutes의 길이와 같습니다.
signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을,
그렇지 않으면 음수임을 의미합니다.
* 알고리즘 분석과 이해 *
이 알고리즘을 살펴보면 주어진 정수 배열과 부호 배열을 이용해서
각 정수의 부호를 고려하여 실제 정수의 합을 계산하는 문제입니다.
주어진 조건을 그대로 구현하면 되는데,
절댓값을 취한 뒤 부호에 따라 더하거나 빼주면 되는 알고리즘인 듯 싶습니다.
* 로직구상 *
반복문을 사용해서 각 정수와 부호를 순회합니다.
부호가 양수이면 해당 정수를 더하고, 부호가 음수이면 해당 정수를 빼서 합을 계산합니다.
* 코드구성 *
반복문("for-in")을 통해 "absolutes"와 "signs"를 순회하면서 각 정수의 실제 값을 계산합니다.
부호에 따라 더할지 뺄지를 결정하여 합을 계산합니다.
계산된 합을 반환합니다.
func solution(_ absolutes: [Int], _ signs: [Bool]) -> Int {
먼저 "solution"이라는 함수를 정의하고, 두 개의 배열을 매개변수로 받고, 정수를 반환해주도록 합니다.
이부문은 문제와 동일하게 "정수 배열 absolutes", "불리언 배열 signs" 이라고 명시되어 있죠.
var sum = 0
그리고 문제에 "실제 정수들의 합을 구하여" 라고 명시되어 있기에
합을 저장할 변수 "sum"을 초기화 해주어야 합니다.
for (absolute, sign) in zip(absolutes, signs) {
그리고 "zip" 라는 함수를 사용하여 "absolutes"와 "signs" 배열을 묶어 튜플 형태로 순회합니다.
"zip" 함수는 두 개의 시퀀스를 받아서 해당 시퀀스들의 요소를 순서대로 묶어 튜플 형태로 반환합니다.
"absolute"에는 "absolutes" 배열의 요소가, "sign"에는 "signs" 배열의 요소가 차례대로 들어가게 되는 것이죠
여기서 튜블형태가 무엇인지 궁금할 수 있으니 아래에 접은 글을 확인해보세요.
튜플(tuple)은 다양한 데이터 타입의 요소들을 하나로 묶어서 표현하는 데이터 구조이며,
Swift에서는 소괄호 ()를 사용하여 튜플을 나타내며, 각 요소는 쉼표 ,로 구분됩니다.
예를 들어, (1, "apple")과 같은 형태의 튜플은 정수와 문자열 두 개의 요소를 갖습니다.
zip 함수는 두 개의 시퀀스(배열, 집합 등)를 받아서 각 시퀀스의 요소들을 튜플 형태로 묶어 반환합니다.
예를 들어, 두 개의 배열 a = [1, 2, 3]과 b = ["a", "b", "c"]가 있다면,
zip(a, b)는 [(1, "a"), (2, "b"), (3, "c")]와 같은 형태의 배열을 반환합니다.
따라서
for (absolute, sign) in zip(absolutes, signs)라는 구문은
"absolutes" 배열과 "signs" 배열을 동시에 순회하면서
각 배열의 요소를 순서대로 묶어 (absolute, sign) 튜플로 받는 것을 의미합니다.
이렇게 함으로써 각 요소에 대해 절대값과 부호를 함께 접근할 수 있습니다.
sum += sign ? absolute : -absolute
}
그리고 각 요소의 부호를 고려해서 합을 계산해야 하겠죠?!
이런 각 요소의 부호를 고려하는 방식으로는 "삼항 조건 연산자"를 사용할 수 있죠,
각 요소의 부호에 따라 값을 더하거나 빼는 부분이 필요할 것 같습니다.
부호가 "true"이면 ("sign"이 "true"이면), "absolute"를 더하고, 그렇지 않으면 "absolute"를 빼주고 반복문이 끝나는..
조금 더 풀어서 본다면 "sign"이 "true"인 경우, 즉 "양수"인 경우에는 "absolute" 값을 더하고,
그렇지 않은 경우에는 음수이므로 "-absolute" 값을 더하는 로직을 다뤄볼 수 있습니다.
return sum
}
그리고 최종 합을 반환하며 끝이 납니다.
총코드는 아래와 같습니다.
import Foundation
func solution(_ absolutes: [Int], _ signs: [Bool]) -> Int {
var sum = 0
// 배열의 요소를 zip하여 동시에 접근합니다.
for (absolute, sign) in zip(absolutes, signs) {
// sign이 true이면 양수이므로 absolute를 더하고,
// 그렇지 않으면 음수이므로 absolute를 빼줍니다.
// 삼항연산자 사용
sum += sign ? absolute : -absolute
}
return sum
}
'IOS > Swift-Algorithm (Programmers)' 카테고리의 다른 글
[Swift] Programmers - 없는 숫자 더하기 (0) | 2024.03.07 |
---|---|
[Swift] Programmers - 핸드폰 번호 가리기 (0) | 2024.03.06 |
[Swift]Programmers - 나누어 떨어지는 숫자 배열 (0) | 2024.03.04 |
[Swift]Programmers - 서울에서 김서방 찾기 (0) | 2024.02.29 |
[Swift] Programmers - 콜라츠 추측 (0) | 2024.02.28 |