https://programmers.co.kr/learn/courses/30/lessons/12912?language=javascript
C++ 만 테스트 케이스 통과 가능하다. 4번, 7번, 9번
풀이 방법은 3가지 정도가 된다.
1. 모든 값 더하기
function solution(a, b) {
if(a==b) return a;
if(b < a){
let tmp = a;
a = b;
b = tmp;
}
let total = 0;
for(let i = a; i <= b; i++) total += i;
return total;
}
2. 절반으로 나누어서 더하기
function solution(a, b) {
if(a==b) return a;
if(b < a){
let tmp = a;
a = b;
b = tmp;
}
let total = 0;
while(a<=b){
if(a==b) total += a;
else total += a+b;
a++;
b--;
}
return total;
}
3. 등차 수열의 합
- 갯수 * (첫째항 + 끝항) / 2
음수가 있음으로 다음과 같은 부분을 주의 필요함
- 음수시작, 양수 종료
- 음수 시작 , 음수 종료
function solution(a, b) {
if(a==0 && b == 0) return 0;
var answer = 0;
if(b < a){ //a가 작은거, b가 큰거
let tmp = a;
a = b;
b = tmp;
}
return sum(a,b);
function sum(low,high){
let lowSum = 0;
let highSum = 0;
let positive = true;
if(low < 0 && high < 0) {
low = -1 * low;
high = -1 * high;
let tmp = low;
low = high;
high = tmp;
positive = false;
}
low = low - 1;
lowSum = low*(low+1)/2;
highSum = high*(high+1)/2;
return positive ? highSum - lowSum : -(highSum - lowSum);
}
}
(상기는 0을 제외하고 low, high sum을 구해서 빼는 방식으로 처리 했음)
상기 코드를 최적화 하면 아래와 같이 고칠 수 있다.
- ((a~b까지의 갯수) * ((첫항 + 마지막항)) / 2
아래 식으로 최적화 가능하다.
(프로그래머스에 다른사람 풀이를 보고 쓴것이다)
(a+b) * (Math.abs(b-a)+1)/2;
- (Math.abs(b-a)+1) : 이게 a에서 b까지의 갯수 구하는 공식 (음수일 경우도 작동)
- (a+b) : 첫항 + 마지막 항
function solution(a, b) {
return (a+b)*(Math.abs(b-a)+1)/2;
}
728x90
반응형
'Problem Solving' 카테고리의 다른 글
문자열 내 p와 y의 개수 (0) | 2020.09.03 |
---|---|
문자열 내 마음대로 정렬하기 (0) | 2020.09.03 |
나누어 떨어지는 숫자 (0) | 2020.09.03 |
같은 숫자는 싫어 (0) | 2020.09.03 |
가운데 글자 가져오기 (0) | 2020.09.02 |