갱스터하우스

[Python] Lv1.음양 더하기 본문

코테 문제/프로그래머스

[Python] Lv1.음양 더하기

승갱 2022. 4. 9. 00:31

https://programmers.co.kr/learn/courses/30/lessons/76501

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 

 

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes [i]의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

 

나의 접근 방법 및 풀이

처음에 문제를 딕셔너리를 이용해서 풀어야 하나 싶었지만 뭔가 복잡해지는 느낌이 들어서 for() 문과 if() 문을 이용해서 풀었다.

signs의 길이만큼 for()문을 반복하며 True일 경우에는 바로 리스트에 추가하고, False일 경우에는 음수이므로 '-'를 붙여서 추가했다.

sum()을 이용하려고 리스트에 추가하는 방식을 선택했는데, 변수에다가 더하는 것도 괜찮은 것 같다.(이것도 시간 복잡도 차이가 나려나...?)

def solution(absolutes, signs):
    answer = []
    for i in range(len(signs)):
        if signs[i] == True:
            answer.append(absolutes[i])
        else:
            answer.append(-absolutes[i])
    return sum(answer)

 

 

다른 풀이

def solution(absolutes, signs):
    return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))

사실 문제를 보고 간단해 보이는 데 for() 문과 if() 문을 덕지덕지(?) 풀면 성공하더라도 약간의 찜찜함이 남아있다. '뭔가 한 줄로 가능할 것 같은데?', '코드를 줄일 수 있을 것 같은데?'라는 생각과 함께.

역시나! 한 줄로 풀 수 있었다.

위에서 dictionary를 사용하고 싶었던 이유가 사실은 zip()이 생각이 안 나서 그랬다는 것을 알 수 있었다.

zip()을 이용해 absolutes와 signs를 짝을 이루어 준 다음, if()문을 이용해서 True이면 absolutes를 False이면 -absolutes를 반환하고 sum()을 이용해서 최종적으로 결과를 return 한다.