티스토리 뷰
문제링크 : https://www.acmicpc.net/problem/2312
#include <bits/stdc++.h>
using namespace std;
int N, num;
int main()
{
cin >> N;
while(N--)
{
map<int, int>m;
cin >> num;
int tmp = num;
for(int i=2; i*i<=num; i++)
{
while(tmp%i==0)
{
m[i]++;
tmp/=i;
}
}
if (tmp > 1) m[tmp]++;
for(auto i : m)
{
cout << i.first << " " << i.second << "\n";
}
}
return 0;
}
소인수 분해를 하고, 이때 소인수의 개수를 같이 출력하는 문제이다.
반복문 i=2부터 시작하여 현재 입력받은 num을 나눌 수 있을 때까지 반복하여 나눠주며 map을 활용해 사용된 개수를 카운팅한다.
이를 i*i<=num 범위까지 반복하여 가능한 모든 소인수를 구해준다.
주의할점은 마지막 소인수를 놓칠 수 있기에, 나누고 남은 결과값 tmp에 대해서 1보다 크다면 추가적인 카운팅을 해주어야 한다.
'백준 > 실버' 카테고리의 다른 글
[백준 3474번] 교수가 된 현우 (C++) (0) | 2025.04.18 |
---|---|
[백준 14490번] 백대열 (C++) (0) | 2025.04.18 |
[백준 1064번] 평행사변형 (C++) (0) | 2025.04.14 |
[백준 17087번] 숨바꼭질 6 (C++) (0) | 2025.04.13 |
[백준 2089번] -2진수 (C++) (0) | 2025.04.12 |