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가 가지는 값을 구하고 이를 이용해서 문제를 푸는 방식을 썼는데, 코드를 간결하게 줄이는 데 성공했다.