[BAEKJOON - C++] 1977번 : 완전제곱수

정다은·2023년 7월 2일
0

BAEKJOON

목록 보기
1/54
C++ 배우기 (51~100) 이 문제집을 참고하여 문제를 풀었습니다.

2023년 1월에서 2월에 프로그래밍을 공부하기 위해 풀었던 문제들이다.

🍑문제

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완전제곱수는 64, 81, 100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.

입력
첫째 줄에 M이, 둘째 줄에 N이 주어진다. M과 N은 10000이하의 자연수이며 M은 N보다 같거나 작다.

출력
M이상 N이하의 자연수 중 완전제곱수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 완전제곱수가 없을 경우는 첫째 줄에 -1을 출력한다.

🍑 대략적인 틀

  • 시작값 끝값을 입력받기
    • 두 정수 변수 start end 를 선언하여 cin으로 입력 받기
  • 완전 제곱수 판별하는 알고리즘 짜는것
    • 1번방법은 무언가 수학적으로 완전 제곱수를 판별 가능한 이론 사용
    • 2번방법은 1부터 10000이라는 범위가 주어졌으므로 노가다로 뽑아내는것 -> 1부터 100까지 for문을 돌려서 모든 제곱수를 뽑아내어 start 부터 end까지 비교하기. 이중 for문이 필요할듯. 혹시 나중에 기회가 된다면. for_each를 사용하여 변형한 for문을 사용해보고 싶음(가능할지는 모르겠음)
  • 완전 제곱수로 판별 된 아이들의 합을 출력
    • 정수 변수 sum을 만들고 for문을 돌리며 완전제곱수 친구들을 더해야한다.
  • 완전 제곱수로 판별 된 아이들 중 가장 작은 친구 출력
    • 가장 작은 친구를 비교하려면 배열에 아이들을 저장해야하지 않을까
  • 완전 제곱수로 아이들이 판별 될 때 마다 count++ 로 수를 세어 0, 즉 start와 end 사이에 완전제곱수가 존재하지 않는 경우 -1이 출력되도록 if문을 짠다.

🍑 작성한 코드

// 완전제곱수
// M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int start, end;

	cin >> start;
	cin >> end;

	int sum = 0, count = 0;
	vector<int> psNum;
	
	for (int i = 1; i <= 100; i++) {
		for (int j = start; j <= end; j++) {
			if (i * i == j) {
				sum += j;
				psNum.push_back(j);
				count++;
				break;
			}
		}
	}

	if (count != 0)
		cout << sum << endl << psNum[0];
	else
		cout << -1;
}
profile
보안 공부하는 대학교 3학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글