본문 바로가기

TIL

가우스 계산법

문제

숫자 2개가 주어질 때, 두 숫자 사이의 값을 구하는 코딩 테스트 문제를 풀었다. 

풀긴 풀었는데, 반복문을 많이 써서 그리 좋은 방법은 아닌것 같다.

나는 코딩테스트를 보고 난뒤 항상 다른사람이 푼 풀이를 보는데, 더 좋은 방법이 있어서 오늘이ㅡ

TIL로 올릴려 한다. 

 

시도한 것
function solution(a, b) {   
    var answer =0; 
    for(let i = Math.min(a,b); i < <Math.max(a,b);i++){
        answer += i; 
    }
  return answer; 
}

나는 간단하게 for문을 돌면서 시작 인덱스에는 두 값에 최소값을, 비교문에는 최댓값을 넣어서 계산을 했다.

나름 참신한 방법이라고 생각을 했는데, 더 좋은 방법이 있는거 같다. 

해결 방법
function solution(a, b) {
    
  return (a+b)*(Math.abs(b-a)+1)/2;
}

이걸 처음보고 이게 뭐지....?? 라고 했는데 가우스 계산식이라고 한다.

수학시간에 배운거 같긴도 한데.... 수학을 안한지 오래되서 까먹은 듯 했다.....

 

위 그림을 보면, 양쪽끝 숫자끼리 더하면 결국 같은 값이 반복해서 나온다. 이걸 토대로 공식화 한게 가우스 계산법이다. 

(a + b) : 양쪽 끝 값을 더한값.

(Math.abs(b-a) +1) : 절대값을 사용한 이유는, 범위의 시작 값이 높은 값이 나올 수 도있기 때문에 사용했다. ex) a : 5, b : 2 

                                   (b-a) +1 은 구할려는 사이 값들의 갯수이다. 

1/2 : 나누기 2를 하는건 2개가 한 쌍을 이루기 때문이다.

다음과 같이 사용하면 시간 순회도가 엄청나게 줄어든다.

알게된 것

매번 느끼는 거지만 코딩테스트 후에는 꼭 다른사람이 한 풀이를 보는 것을 추천한다. 아니 그냥 봐야된다.

그냥 보고 있으면 신기하다. 볼만하다. 재밌다. 

이걸 안까먹는게 중요한데.... 나처럼 그냥 박제를 해라 그러면 까먹어도 다시보겠지... 

 

 

참조

https://workshop-code.tistory.com/51