#연습문제
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12912
풀이
- 두 정수(a, b)를 입력받으면, 두 수 사이에 속한 모든 정수의 합을 return하는 함수를 정의한다.
- a == b인 경우, 둘 중 하나 랜덤으로 리턴
- -10,000,000 <= a, b <= 10,000,000
- a, b는 정수이며, 대소 관계 정해지지 않음 → a가 b보다 작은경우, 큰 경우 모두 고려해야 함
- 입력 받은 값의 대소 비교를 위해 → min, max 함수 사용
- 그 사이 범위를 range로 지정 → for문 + sum()으로 합 구하기
코드
def solution(a, b):
return sum(i for i in range(min(a,b),max(a,b)+1))
a, b 모두 포함해야 하므로 max부분에는 +1을 해줬다.
한 줄 코드가 무조건 좋다고 볼 수 없는데... 직관성을 높이기 위해 좀 더 풀어서 쓰는 연습을 해야겠다.
다른 풀이
- 두 변수값을 교환할 때 : a, b = b, a도 가능하다
- temp를 안써도 됨 (!!!)
- sum()에 인자로 들어가는 자료형은 literal이면 된다. (sum에 대해 제대로 알자.. 정리해놓고 왜 써먹지는 못하니...ㅠ)
- range만으로 이미 iteral 성질을 가지고 있다.
- 따라서 내가 쓴 코드 중 for앞부분은 불필요하다..
def adder(a, b):
if a > b: a, b = b, a
return sum(range(a,b+1))
#따라서, 내 코드도 return sum(range(min(a,b), max(a,b)+1))로 고칠 수 있다.
- 단순 등차수열의 합 문제로 접근할 수 있다. 수학적으로 생각하면 시간 복잡도가 O(1)이다.
- n까지의 합 : 1/2*n*(1+n) ------→ a ~ b사이 합: 1/2*|a-b|*(a+b)
- 절댓값 적용시 abs(a-b) + 1 (b 포함한 개수 카운팅이므로 +1)
- 정수들의 합이므로 int형을 return 하기 위해 몫(//)을 구한다.
def adder(a, b):
return (abs(a-b)+1)*(a+b)//2
+
Sum(iterable)
- sum()의 인자로는 iterable 하기만 하면 OK
'Algorithm > Programmars' 카테고리의 다른 글
[JAVA] Lv.2 타겟 넘버 - 프로그래머스 (1) | 2023.12.07 |
---|---|
[JAVA] Lv.2 큰 수 만들기 - 프로그래머스 (1) | 2023.12.04 |
[Python/Level.1] 2016년 (0) | 2022.07.20 |
[Python/Level.1] 문자열 내 p와 y의 개수 (0) | 2022.07.12 |
[Python/Level.1] 약수의 개수와 덧셈 (0) | 2022.07.12 |