PS (C, C++)

[백준/c] 1292 쉽게 푸는 문제

최연재 2022. 8. 20. 00:09

https://www.acmicpc.net/problem/1292

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

 

코드

#include <stdio.h>

int sum(int n)
{
	int check = 1;
	int result = 0;
	for (int i = 1; i <= n; i++)
	{
		result += check;
		if (i == check * (check + 1) / 2) check++;
	}
	return result;
}

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	printf("%d", calculate(m) - calculate(n - 1));
	return 0;
}

코드 설명

메인함수

구간의 시작과 끝을 나타내는 정수를 입력받는다. 

숫자의 합을 시작~끝까지 더해나가는 것이 아니라 1~끝의 합에서 1~(시작-1)까지의 합을 뺀 값을 출력한다. 

 

sum 함수

check라는 변수와 반환할 변수 result를 선언한다. 

n만큼 반복하며 check를 더한다. 

만약 i = check*(check+1)/2라면 check에 1을 더한다. 

-> 배열을 나열하면 1 2 2 3 3 3 4 4 4 4 ... 가 되는데 값이 변화하는 지점은 1, 1+2, 1+2+3... 이다. 그래서 값이 변화하는 지점은 시그마 합 공식으로 구할 수 있다.

더해나가다가 현재의 반복 횟수가 값이 변화하는 지점이라면 check를 증가시키면 된다. 

 

 

느낀 점

처음에는 구간의 시작부터 끝까지 값들을 하나하나 더해나가려고 했는데, 관련 문제들을 계속 풀어보면서 뺄셈을 활용할 수 있게 됐다. 처음에는 find라는 함수를 써서 구간의 끝에서 check가 가지는 값을 구하고 이를 이용해서 문제를 푸는 방식을 썼는데, 코드를 간결하게 줄이는 데 성공했다. 

'PS (C, C++)' 카테고리의 다른 글

[백준/C] 반복문  (0) 2022.08.20
[백준/C] 조건문  (0) 2022.08.20
[백준/C] 입출력과 사칙연산  (0) 2022.08.20
[백준/C] 1193 분수찾기  (0) 2022.08.19
[백준/C] 9996 한국이 그리울 땐 서버에 접속하지  (0) 2022.08.19