알고리즘

Doit! 자료구조와 함께하는 알고리즘 입문(자바) : 가우스의 덧셈

DASON 2023. 5. 23. 11:55

문제

1~10의 합은 (1+10)*5와 같이 구할 수 있습니다. 이를 '가우스의 덧셈'이라고 하는데 이 방법을 이용하여 1부터 n까지의 정수 합을 구하는 프로그램을 작성하세요(31page)


1. 홀수와 짝수를 구분해서 생각하기

2. 코드를 간결하게 만들기

 

int sum = (n%2==0) ? (1+n)*(n/2) : n*((n+1)/2);

이게 맞나 하고 작성했다. 보기 좋게 변형 시킨 아래의 코드.

sum = (n%2==0) ? (n+1)*(n/2) : (n+1)*n/2;

삼항연산자가 필요없는 같은 식이라고 착각이 되어버렸다. 분명히 놓친 부분이 있는데, 결과값은 제대로 나와서 의아함이 풀리지 않는다.

 

 

의아함에 휩싸인 중에 살펴본 답안 코드는 다음과 같았다.

// 참고 답안
int sum = (n + 1) * (n / 2) + (n % 2 == 1 ? (n + 1) / 2 : 0);   // 총합

홀수의 경우 중앙값을 따로 더해줘야 한다. 이를 알고 있었음에도 코드에 반영하지 못했다는 건 코드를 작성할 때 마음이 급해 세심하게 조건을 따지지 않았다는 것. 반성한다.

 

막연히 int/int=int이기 때문에 중앙값을 더하지 않아도 같은 결과값이 나오는 거겠지 싶었는데 이를 눈으로 확인했다. 괄호로 인한 우선순위에 따라 int 값이 달라짐으로써 최종 결과값에 차이가 있다는 걸 이렇게 다시 배우게 되어 기쁘다. 하마터면 이것도 모르는 바보될 뻔..ㅜ (순간적으로 몰랐으니 바보이기는 해~)

// 1. 홀짝 모두 같은 값 도출
int sum = (n+1)*n/2;
		
// 2. 홀수의 경우 오답을 도출
sum = (n+1)*(n/2);
		
// 답안
sum = (n+1)*(n/2)+(n%2==1 ? (n+1)/2 : 0);

깨달음의 끝에 마주한 나의 최종 코드

import java.util.Scanner;
class q7 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("1부터 n까지의 합을 구합니다.");
		System.out.print("n값 : ");
		int n = scan.nextInt();
		scan.close();
		
		int sum = (1+n)*(n/2);
		if(n%2==1) sum+=(n+1)/2;
		
		System.out.println("1부터 "+n+"까지의 합 : "+sum);
	}
}