문제 설명

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

 

제한사항

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

 

입출력 예

absolutes signs
[4, 7, 12] [true, false, true]
[1, 2, 3] [false, false, true]

 

내 풀이

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

 

회고

  • 처음에는 반복문을  for i in signs 로 썼는데 되지 않았다. 구글링했을 때 참고한 자바스크립트 답안은  for(var i in signs) 로 써도 돌아가는 것 같던데 왜 파이썬은 안 됐을까? 문법만 다를 뿐 의미는 같은 것 같았는데... 궁금.
  • 절댓값에 부호를 달아주기 위한 행을 따로 추가했다. 양수를 음수로 바꾸기 위해  변수 * (-1)  이용
  • 절댓값에 부호를 달아주기 위한 행, answer에 값을 담기 위한 행을 따로 쓰지 않고 아래와 같이 간단하게 쓸 수도 있다.
    if(signs[i] == True):
        answer += absolutes[i]
    else:
        answer -= absolutes[i]
  • absolutes와 signs는 길이가 같은 배열이기 때문에  range(len(absolutes)) 를 써도 똑같이 돌아간다.
  • 다른 사람의 풀이를 보니 zip 함수를 쓴 풀이도 있다. zip은 처음 들어봤는데 배워갑니다.
for absolute, sign in zip(absolutes, signs):
    if sign:
    	answer += absolute
    else:
    	answer -= absolute
  • 그리고 또 꿀팁을 얻었다. 블록 설정하고  Ctrl + /  누르면 한 번에 주석 설정할 수 있음.

 

zip 함수

  • 동일한 개수의 자료형을 묶어 튜플 형태로 반환
  • iterable 객체를 인자로 받음
  • 짝이 있는 부분만 return 하고, 짝이 없는 인덱스는 버려진다
  • for문에 zip 함수를 쓴 게 이해가 안 돼서 print문으로 하나씩 찍어봤다.
for absolute, sign in zip(absolutes, signs):
    print(zip(absolutes, signs))
    print(absolute)
    print(sign)
  • 실행결과는 아래와 같다.
<zip object at 0x7fb96d55f840>
4
True
<zip object at 0x7fb96d55f8c0>
7
False
<zip object at 0x7fb96d55f900>
12
True
<zip object at 0x7f2e7edd67c0>
1
False
<zip object at 0x7f2e7edd6840>
2
False
<zip object at 0x7f2e7edd6880>
3
True
  • 진짜 많이 배워갑니다.
복사했습니다!