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

최근 글 👑

[Swift]Programmers - 음양 더하기

2024. 3. 5. 12:28ㆍIOS/Swift-Algorithm (Programmers)
SMALL

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
}
728x90