: solved.ac - bronze 1
https://www.acmicpc.net/problem/1292
1292번: 쉽게 푸는 문제
첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.
www.acmicpc.net
예제 입력
3 7
예제 출력
15
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int num[1001];
void make_num() {
int cnt = 1;
for (int i = 0; i < 1001;) {
for (int j = 0; j < cnt; j++) {
num[++i] = cnt;
}
cnt++;
}
}
int main() {
int a, b, total = 0;
scanf("%d %d", &a, &b);
make_num();
for (int i = a; i <= b; i++) {
total += num[i];
}
printf("%d", total);
return 0;
}
해설
: 문제에서 제시하는 수열을 미리 만들어 놓고, 그 수열 안에서 a번째부터 b번째 수까지의 합을 구한다.
(이 문제도 1145번처럼 어렵게 생각할 필요 없는 문제이다. 수열의 길이가 길어 봐야 1000번째 수까지이므로 충분히 계산하여 만들어 놓을 수 있고, 합을 구하는 것도 어렵지 않다.)
1. 전역 변수로 수열이 들어갈 배열을 만들어 놓고, 수열을 생성하는 함수를 만든다.
cnt 변수는 반복할 수를 담는 변수이다.
바깥쪽 for문은 수열 전체를 아우르는 식이다. 0에서 시작해 1000까지 반복한다.
조건식은 앞의 두 개까지만 쓰고, 증감식은 쓰지 않는다. i를 증가시키는 식이 안에 따로 있기 때문이다.
안쪽 for문은 cnt에 담긴 수를 cnt만큼 반복하는 식이다. 이 안에서 i를 증가시킬 것이다.
num[++i]는 i가 num[1]부터 (한 번 증가하고 시작하니 0은 건너뛰고 1부터) num[1000]까지 가리키도록 만들고
그 안에 cnt가 cnt번 반복되어 쓰일 것이다. cnt번의 반복이 끝나고 나면 cnt가 1 증가하고, 다음 수를 똑같이 반복한다.
이렇게 함수를 수행하고 나면 num[0] = 0이고, num[1]~num[1000]까지에는 수열이 들어간 배열이 만들어진다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int num[1001];
void make_num() {
int cnt = 1;
for (int i = 0; i < 1001;) {
for (int j = 0; j < cnt; j++) {
num[++i] = cnt;
}
cnt++;
}
}
2. 수열을 만들고 나면 메인 함수는 간단하다. 구간이 될 두 수와 합계를 담을 변수를 만들고 입력값을 받는다.
함수로 수열을 만들고, 정확히 a부터 b까지의 인덱스를 반복문을 통해 훑으며 합계를 구하고 출력한다.
int main() {
int a, b, total = 0;
scanf("%d %d", &a, &b);
make_num();
for (int i = a; i <= b; i++) {
total += num[i];
}
printf("%d", total);
return 0;
}
'C언어 > BAEKJOON' 카테고리의 다른 글
[백준] 2846. 오르막길 (0) | 2022.07.29 |
---|---|
[백준] 1357. 뒤집힌 덧셈 (0) | 2022.07.28 |
[백준] 1145. 적어도 대부분의 배수 (0) | 2022.07.21 |
[백준] 1110. 더하기 사이클 (0) | 2022.07.13 |
[백준] 1157. 단어 공부 (0) | 2022.07.13 |