#월간 코드 챌린지 시즌2
문제
https://school.programmers.co.kr/learn/courses/30/lessons/76501
풀이
- 매개변수로 두 List를 받아온다. abs가 저장된 absolutes, 해당 값의 부호를 true, false로 저장한 signs
- True 는 +, False 는 -로 대응된다.
- len(absolutes) == len(signs)이므로 둘 중 하나의 길이를 이용해 range로 for문을 돌려준다
- 둘 다 각 값을 불러오는데 인덱스가 필요하므로 range를 이용해 정수로 for문을 돌렸다.
- signs[i] == True면 if 이하가 실행된다 (answer에 더함)
코드
def solution(absolutes, signs):
answer = 0
for i in range(0,len(absolutes)):
if(signs[i]): answer += absolutes[i]
else: answer -= absolutes[i]
return answer
더 간단하게 풀 방법이 없나 싶어서 map과 zip을 생각해봤는데... 그래도 for문을 돌려야 할 것 같아서 사용 안했다.
다른 사람들의 풀이를 보고 나니 더 오래 생각해볼걸 그랬다..ㅎㅎ
다른 풀이
- zip을 이용해 abs와 signs를 합쳐서 수행했다. for a, b in zip으로 각 abs, 그에 대응하는 부호를 차례로 꺼내온다.
- 이 값들을 if, else를 이용해 boolean 값을 부호로 적용해주고, sum을 사용해 계산한 값을 리턴한다.
- 근데 이 모든 과정이 return 안에 들어간다(!)
def solution(absolutes, signs):
return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))
+
1. zip()
- 동일한 인덱스를 가진 짝별로 묶어 튜플로 담아 반환
- 여러 개의 순회 가능한 객체를 인자로 받음 (리스트, 튜플 ...) -> 2개 이상
- 만약 쌍으로 존재하지 않는다면 버려짐
- zip을 활용해 병렬처리가 가능하다. (여러 그룹의 데이터를 루프 돌며 한 번만 처리 가능)
for number, upper, lower in zip("12345", "ABCDE", "abcde"):
- unpacking : 풀기 연산자를 붙여 다시 zip()에 넘기면 unzip 가능
>>> pairs = list(zip(absolutes, signs))
>>> print(pairs)
[(1,True),(2,False),(3,True)]
>>> absolutes, signs = zip(*pairs)
>>> absolutes
(1,2,3)
- 사전 변환: zip을 이용해 2개의 리스트(or 튜플) --> 딕셔너리형 생성 가능
dict(zip(keys, values))
'Algorithm > Programmars' 카테고리의 다른 글
[Python/Level.1] 문자열 내 p와 y의 개수 (0) | 2022.07.12 |
---|---|
[Python/Level.1] 약수의 개수와 덧셈 (0) | 2022.07.12 |
[Python/Level.1] 모의고사 (0) | 2022.07.09 |
[Python/level.1] 로또의 최고 순위와 최저 순위 [2021 Dev-Matching: 웹 백엔드 개발자(상반기] (0) | 2022.07.07 |
[Python/Level.1] 신고 결과 받기 [2022 KAKAO BLIND RECRUITMENT] (0) | 2022.07.07 |