문제 링크
난이도 : 브론즈 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);
}