작성일 :

문제 링크

1977번 - 완전제곱수

설명

이 문제는 주어진 범위 내에서 완전제곱수(perfect square)만을 골라서 그 합과 최솟값을 출력하는 문제입니다.

완전제곱수란 어떤 정수 \(x\)에 대해 \(x^2\) 형태로 표현되는 수를 의미합니다.

예: \(1^2\), \(2^2\), \(3^2\), …, \(100^2\)


접근법

  • \(1^2\)부터 \(100^2\)까지 미리 완전제곱수를 표시해두기 위해 배열에 기록합니다.
  • 입력된 min, max 범위 내에서 완전제곱수인지 여부를 확인하여:
    • 합을 누적하고
    • 가장 처음 등장한 완전제곱수를 최솟값으로 저장합니다.
  • 만약 해당 범위 내에 완전제곱수가 없다면 -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
25
26
27
28
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var min = int.Parse(Console.ReadLine()!);
      var max = int.Parse(Console.ReadLine()!);

      var isSquare = new bool[10_001];
      for (int i = 1; i * i <= 10_000; i++)
        isSquare[i * i] = true;

      int sum = 0, minVal = 0;
      for (int i = min; i <= max; i++) {
        if (isSquare[i]) {
          sum += i;
          if (minVal == 0) minVal = i;
        }
      }

      if (minVal == 0) Console.WriteLine("-1");
      else {
        Console.WriteLine(sum);
        Console.WriteLine(minVal);
      }
    }
  }
}



[ 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
#include <bits/stdc++.h>
#define MAX 10'001

using namespace std;

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

  bool sieve[MAX] = {0, };
  for (int i = 1; i <= 100; i++)
    sieve[i * i] = true;

  int min, max; cin >> min >> max;
  int sum = 0, minAns = 0;
  for (int i = min; i <= max; i++) {
    if (sieve[i] == true) {
      if (!minAns) minAns = i;
      sum+= i;
    }
  }

  if (!minAns) cout << "-1\n";
  else cout << sum << "\n" << minAns << "\n";

  return 0;
}