문제 링크
난이도 : 브론즈 1

문제 내용

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.

입력

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

출력

첫 줄에 구간에 속하는 숫자의 합을 출력한다.

문제 분석

1 22 333 4444 55555 666666 …

구간의 끝의 최대가 1000이니까, 최대 수가 몇인지 일단 알아보자

#include <stdio.h>
 
int main() {
    int index = 0;
    int i = 1;
    while (index < 1000){
        printf("%d start index = %d\\n", i, index);
        for (int j = 0; j < i; j++)
        {
            printf("%d", i);
            index++;
        }
        printf("\\n");
        i++;
    }
    
}

최대 수는 990번째 인덱스부터 시작하는 45임

이정도면 그냥 시작할 때 리스트에 넣어두면 될 것 같음

XXX 그러지 말고 그냥 계속 돌다가 a 위치부터 result에 더하고 b 위치에서 끝내면 될 듯

작성한 코드

// 250108
 
#include <stdio.h>
#include <iostream>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int a, b;
    cin >> a >> b;
 
    int index = 1;
    int i = 1;
    int result = 0;
    while (true) {
        // cout << "index : " << index << "\\n";
        for (int j = 0; j < i; j++){
            // cout << i;
            if(index >= a) result += i;
            if (index == b){
                // cout << "\\n\\nResult : " << result;
                cout << result;
                return 0;
            }
            index++;
        }
        i++;
        // cout << "\\n";
    }
}

우수 코드 분석

#include<cstdio>
int x, y,c,r;
int main() {
	scanf("%d %d", &x, &y);
	for (int i = 1; c < y; i++) for (int j = 1; j <= i&&c < y; j++,c++) r += i*(c>x-2);
	printf("%d", r);
	return 0;
}

와 이게 뭐지..

a, b = x, y

result = r

i가 full iterater인가봄

정수에 부울을 곱할 수 있나?

혹시나 하는 마음에 아래 테스트코드를 써봄

#include <iostream>
using namespace std;
 
int main() {
    cout << 20 * (1 < 20); // 20
    cout << 20 * (1 > 20); // 0
}

정수 * bool 해도 되는듯?? 대박이네

c가 현재 위치인 것같음

c > x-1 인 순간부터 더해야 하니까

r += i * (c>x-2) 로 하신듯!!!! 와우

미리 시작할 때 리스트에 넣어두는 방식으로 코드 만드신 분도 있길래 가져와봄

#include <cstdio>
 
short num[1035];
int   index;
 
int main() {
	short a, b;
	int sum = 0;
 
	for (int i = 0; i < 46; i++) { // <- 위에서 최대수가 45인걸로 보인다고 했는데 그거 사용해서 하신듯
		for (int j = 0; j <= i; j++)
			num[index++] = i + 1;
	}
 
	scanf("%hd %hd", &a, &b);
 
	for (int i = a - 1; i < b; i++)
		sum += num[i];
 
	printf("%d\\n", sum);
}