본문 바로가기

Skill Sets/Python

[Python] 음양 더하기(프로그래머스/python/Level 1)

SMALL

 

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "음양 더하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/76501)

 


 

 

1. 문제 :  음양 더하기(Lv. 1)

 


 

2. 문제 설명

 

어떤 정수들이 있습니다.

이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와

이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다.

실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

[ 제한 사항 ]

 

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

 

[ 입출력 예 ]

 

absolutes signs result
[4,7,12] [True, False, True] 9
[1, 2, 3] [False, False, True] 0
[1, 1, 1] [True, True, True] 3

 

[ 입출력 설명 예 ]

 

입출력 예 #1

signs가 [True,False,True] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
따라서 세 수의 합인 9를 return 해야 합니다.

입출력 예 #2

signs가 [False,False,True] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
따라서 세 수의 합인 0을 return 해야 합니다.

입출력 예 #3

signs가 [True,True,True] 이므로, 실제 수들의 값은 각각 1, 1, 1입니다.
따라서 세 수의 합인 3을 return 해야 합니다.

 


 

3. 문제 풀이

 

# 1안
def solution(absolutes, signs):
    answer = 0
    signs2 = []
    for i in range(len(signs)):
        if signs[i] == True :
            signs2.append(1)
        else :
            signs2.append(-1)
    for i in range(len(absolutes)):
        answer += absolutes[i] * signs2[i]
    return answer

# 2안
def solution(absolutes, signs):
    answer = 0
    for i, absolute in enumerate(absolutes):
        if signs[i]:
            answer += absolute
        else:
            answer -= absolute
    return answer

 

 

문제 설명에 맞는 코드를 작성하기 위해서 총 2안으로 작성했습니다!

 

두 코드 모두 내용적으로는 동일한 내용이고

 

2안은 1안을 enumerate() 함수를 통해 더 간결하게 표현하였습니다!

 

#  1안 풀이 설명

# [ 문제 풀이 설명 ]

 

문제와 입출력 예시를 보며, absolutes 배열 혹은 signs 배열의 있는 개수만큼

 

반복을 해주는 것이 필요하겠다고 생각을 했습니다!

 

첫 번째 반복분에서는 signs의 배열에서 true와 false를 확인했어요!

 

양수면 1 음수면 -1을 signs2라는 배열에 저장해 주었습니다.

 

이후에 absolutes 배열에 있는 값과 signs2 배열에 있는 값을 곱하고

 

이를 answer이라는 변수에 저장했습니다!

 

 

absolutes = [4,7,12], signs = [true,false,true] 인 경우를 예로 들어볼게요!

 

첫 반복분에서 signs = [true,false,true]을 참고해서

 

양수와 음수를 나타내는 signs2를 만들면

 

signs2 = [1, -1, 1]로 만들어집니다.

 

두 번째 반복분에서 absolutes의 값과 signs2의 값을 곱하고 더하면

 

4*(1) + 7*(-1) + 12(1) = 9

 

answer =9

 

이후 answer 변수를 return 해주었습니다!

 

# 1안

def solution(absolutes, signs):
    answer = 0
    signs2 = []
    # 양수와 음수를 위치를 저장하는 signs2 생성
    for i in range(len(signs)):
        if signs[i] == True :
            signs2.append(1)
        else :
            signs2.append(-1)
    # 값과 부호를 곱하고 더하여 answer 값 생성
    for i in range(len(absolutes)):
        answer += absolutes[i] * signs2[i]
    return answer

 

 

#  2안 풀이 설명

# [ 문제 풀이 설명 ]

 

2안의 코드는 1안의 코드와 동일한 내용이에요!

 

코드를 조금 더 간결하기 작성하기 위해서 리스트 컴프리헨션(List Comprehension)을 활용해 보았어요!

 

리스트 컴프리헨션은 리스트를 생성하기 위해 반복문과 조건문을 사용하여 한 줄로 표현하는 기법을 말해요!

 

1안에서 한 것과 같이 리스트를 선언한 루프 방식(반복문)과 비교해 보면,

 

리스트 컴프리헨션은 더 간결하고 가독성이 좋아서 코드를 더 효율적으로 작성할 수 있습니다.

 

 

1안과 동일하게 absolutes = [4,7,12], signs = [true,false,true] 인 경우를 예로 들어볼게요!

 

이를 이용해 보면

 

초기에 answer=0으로 정의를 하고

 

signs에서 양수이면 더하고 음수이면 빼는 코드를 반영했습니다

 

0

+ 4 ( signs[0] 은 양수이므로,  +)

+ 7 ( signs[1] 은 양수이므로,  -)

+ 12 ( signs[2] 은 양수이므로,  +)

= 0 + 4 - 7 + 12

= 9

 

# 2안
def solution(absolutes, signs):
    answer = 0
    # signs의 위치에서 양수와 음수를 판별 후 +/-를 부여
    for i, absolute in enumerate(absolutes):
        if signs[i]:
            answer += absolute
        else:
            answer -= absolute
    return answer

 

 


 

4. 문제 풀이 후기

 

이번 문제는 절댓값을 담은 정수 배열 absolutes와 부호를 담은 불리언 배열 signs를 이용하여

 

부호를 고려한 정수의 합을 구하는 문제였습니다.

 

이번 문제는 어떻게 풀지 접근하는 방식에 따라

 

매우 다양하게 풀이 방법이 나올 수 있을 것 같아요!

 

저는 개인적으로 코드상 간결하지는 못하더라도 직관적으로 코드를 확인할 수 있는 것을 선호해요!

 

그래야 타인이 유지보수를 하는 경우에도 쉽게 수정이 가능하더라고요!

 

물론 실행하는 환경에서 성능이 우선적으로 필요할 수도 있지만요!

 

이 문제에서는 크게 어려운 부분이 없어서 제가 따로 더 코멘트할 것은 없습니다!

 



이번 포스팅은 프로그래머스에 있는

 

python을 이용한 코딩테스트 문제를 풀어보았습니다!

 

앞으로도 계속 sql 뿐만 아니라 python을 이용한 코딩테스트도 포스팅을 하려고 합니다!

 

너무 쉬운 부분만 있다면 이번 포스팅처럼  다른 풀이 방법도 설명하면서 진행하려고 해요!

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

LIST