본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1977 완전제곱수

by 까망 하르방 2021. 8. 5.
반응형

출처https://www.acmicpc.net/problem/1977

Approach

완전탐색 기법이란? 유형 문제이다.

 

완전탐색 기법이란?

가능한 모든 값을 대입해보는 무식한(?) 방법에 해당된다. 문제 내용 속에서 특정 규칙을 찾아서 모든 Case를 대입해보지 않고도 풀리는 경우도 있지만 충분한 제한 공간과 시간이 주어진다면 

zoosso.tistory.com

 

두 수 N, M이 10000 이하의 자연수이기 때문에

M, N 사이의 특정 구간을 모두 탐색해도 TLE가 발생하지 않는다.

for문으로 탐색하되, 완전 제곱수를 i * i로 표현

- M과 N사이의 숫자인지

- 해당 되는 완전 제곱수들의 합

- 최소값 처리


#include <iostream>

const int MAX_NM = 1e4;
inline int min(int A, int B) { return A < B ? A : B;}

using namespace std;

int ansSum, ansMin = MAX_NM + 5;
int M, N, square;

int main() 
{
	// freopen("input.txt", "r", stdin);
	cin >> M >> N;
	
	for (int i = 1; i <= MAX_NM; ++i)
	{
		square = i * i;
		// 완전 제곱수가 M보다 큰 경우
		if (square >= M)
		{
			if (square > N)
				break;

			// M <= 완전 제곱수 <= N 인 경우
			ansSum += square;
			ansMin = min(ansMin, square);
		}
	}

	if (ansSum == 0)
	{
		cout << -1 << endl;
	}	
	else 
	{
		cout << ansSum << endl;
		cout << ansMin << endl;
	}
}

 

Java

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int M = Integer.parseInt(sc.next());
		int N = Integer.parseInt(sc.next());
		
		int cnt = 0;
		
		int reM = (int)Math.ceil(Math.sqrt(M));
		int reN = (int)Math.floor(Math.sqrt(N));
		
		// 완전 제곱수의 합산
		int sum = 0;
		for(int i=reM; i<=reN; i++) {
			cnt++;
			sum += i*i;
		}
		
		if(cnt == 0) {
			System.out.println(-1);
		}else {
			System.out.println(sum);
			System.out.println(reM * reM);
		}
	}
}
반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 1024 수열의 합  (0) 2021.08.07
[BOJ] 백준 1110 더하기 사이클  (0) 2021.08.06
[BOJ] 백준 1934 최소공배수  (0) 2021.08.04
[BOJ] 백준 13701 중복 제거  (0) 2021.08.02
[BOJ] 백준 2210 숫자판 점프  (0) 2021.07.29

댓글