[BAEKJOON - C++] 2501번 : 약수 구하기

정다은·2023년 7월 3일
0

BAEKJOON

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

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

🍑문제

어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.

6을 예로 들면
6 ÷ 1 = 6 … 0
6 ÷ 2 = 3 … 0
6 ÷ 3 = 2 … 0
6 ÷ 4 = 1 … 2
6 ÷ 5 = 1 … 1
6 ÷ 6 = 1 … 0
그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.

두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

출력
첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

🍑대략적인 틀

  • 첫째줄에 약수를 구할 숫자(1~10000)와 몇번째로 작은 수를 출력할지(1~약수를 구할 수) 입력받음
  • 약수중에 입력한 수번째로 작은 수를 출력한다.

🍑오류 해결

이번에도 역시 벡터를 사용하니 오류가 났는데, 6과3을 넣을 떄에는 문제가 없었지만 25와 4를 넣으니 문제가 생겼다. 아무래도 제한조건을 걸어두었지만 aliquot[small]; 이 문제였던 것 같다. 입력된 숫자는 4인데 4번째 원소가 없으므로. 아무래도 벡터는 확실히 다루기가 어려운듯하다 ㅜㅜ

이렇게 제한 조건을 걸어 이상한 인덱스에 접근하게 하지 않았음에도 오류가 뜨는 것을 해결할 방법은 없는 것인지 궁금하다.

  • 벡터를 사용한 코드 (오류 미해결 코드)
    #include <iostream>
    using namespace std;
    
    #include <vector>
    
    int main() {
    	int num, small;
    	cin >> num >> small;
    
    	vector<int> aliquot;
    
    	aliquot.push_back(0);
    	for (int i = 1; i <= num; i++) {
    		if (num % i == 0) 
    			aliquot.push_back(i);
    	}
    
    	if (aliquot.size() < small)
    		cout << aliquot[0];
    	else
    		cout << aliquot[small];
    }

🍑 작성한 코드

#include <iostream>
using namespace std;

int main() {
	int num, small, count = 0;
	cin >> num >> small;

	int aliquot[1000] = {0};

	for (int i = 1; i <= num; i++) {
		if (num % i == 0) {
			aliquot[count+1] = i;
			count++;
		}
	}

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

0개의 댓글