문제
동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.
이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.
하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.
조건 및 입출력
1. 첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.
2. 첫 줄에 구간에 속하는 숫자의 합을 출력한다.
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int start, end;
scanf("%d %d", &start, &end);
int sum = 0; int k = 0;
int nums[1000] = { 0 };
for (int i = 0; i <= end; i++)
for (int j = 0; j < i; j++)
{
if (k == 1000)
break; // 배열 크기 오버 방지
nums[k] = i;
k++;
}
for (int m = start; m <= end; m++)
sum += nums[m-1];
printf("%d\n", sum);
return 0;
}
풀이 과정
문제를 우선 이해 해 보자.
문제에서 요구하는 정답은, 아래와 같은 배열(수열)이 있다고 하면, 구간을 정해줬을 때, 그 구간의 합을 도출하는 문제다.
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 .......
예를 들어 3 7 을 입력하면,
2+3+3+3+4 이므로, 결과는 15가 나온다.
이를 구현하기 위해, 시작과 끝값을 받는다.
이후 끝 값까지 루프를 돌리는 for문을 만들고,
해당 숫자의 갯수만큼 수열을 생성하는 for문을 만든다.
단, 수열의 크기가 1000이 되면 수열의 생성을 종료한다.
(break를 하지 않으면 배열 크기를 넘어가는 값을 입력하게 된다.)
수열이 만들어 졌다면, 시작과 끝값을 이용해 해당 범위에 있는 값을 모두 더한다.
여담
자꾸 런타임 에러(배열 범위 초과)가 떠서, 도대체 뭐가 문젠지 한참 생각했다.
배열의 크기가 1000인데, 자꾸 숫자를 집어넣으니 배열 초과 런타임 에러가 났던 것이다.
C를 하다보니, 한 문제를 풀더라도 버벅인다..
C가 규칙이 까다로운 걸까... Python이 널널한걸까...?
| 코드가 이상하거나, 이해되지 않는 부분은 댓글 남겨주세요! + 더 좋은 풀이 방법이 있다면 알려주시면 감사하겠습니다! :) |
'Programming > C언어' 카테고리의 다른 글
| [백준] 2355번 : 시그마 (C언어 / C99) (0) | 2023.01.20 |
|---|---|
| [백준] 11050번 : 이항 계수 1 (C언어 / C99) (0) | 2023.01.17 |
| [백준] 1977번 : 완전제곱수 (C언어 / C99) (0) | 2023.01.16 |
| [백준] 9501번 : 꿍의 우주여행 (C언어 / C99) (2) | 2023.01.14 |
| [백준] 10102번 : 개표 (C언어 / C99) (0) | 2023.01.12 |