작성일 :

문제 링크

1292번 - 쉽게 푸는 문제

설명

이 문제는 수열을 특정 규칙으로 생성한 후,
입력으로 주어진 구간의 합을 구하는 문제입니다.

수열은 다음과 같은 규칙을 따릅니다:

\[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, \dots\]

즉, 1은 한 번, 2는 두 번, 3은 세 번, … kk번 반복됩니다.


접근법

  • 수열을 1000번째 숫자까지 구성해 배열에 저장합니다.
  • 인덱스 A부터 B까지의 구간 합을 계산하여 출력합니다.
  • 구간은 1-based index이므로, 계산 시 배열 접근을 A-1부터 B-1까지로 처리합니다.

Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var parts = Console.ReadLine()!.Split();
      int a = int.Parse(parts[0]) - 1;
      int b = int.Parse(parts[1]) - 1;

      int[] arr = new int[1_000];
      int idx = 0, cnt = 1;
      while (idx < 1_000) {
        for (int i = 0; i < cnt && idx < 1_000; i++)
          arr[idx++] = cnt;
        cnt++;
      }

      long sum = 0;
      for (int i = a; i <= b; i++)
        sum += arr[i];
      Console.WriteLine(sum);
    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
#define MAX 1'000

using namespace std;
typedef long long ll;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int arr[MAX];
  int idx = 0, cnt = 1;
  while (idx < MAX) {
    for (int i = 0; i < cnt && idx < MAX; i++)
      arr[idx++] = cnt;
    cnt++;
  }

  int a, b; cin >> a >> b;

  a--; b--;

  ll sum = 0;
  for (int i = a; i <= b; i++)
    sum += arr[i];
  cout << sum << "\n";

  return 0;
}