https://www.acmicpc.net/problem/1292
코드
#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 |