728x90
안녕하세요 평범한 컴공생입니다.
오늘은 백준 2231번 문제 [분해합] 알고리즘 포스팅을 해보도록 하겠습니다.
브루트포스 문제이며 쉬운 난이도에 속합니다.
1. 문제 해결 방법 구상하기
- 먼저 N의 값을 입력받는다.
- 메모리 제한이 넉넉하므로 완전탐색을 하면 될 듯하다.
- 1부터 N-1 까지의 모든 수를 분해합하여 N과 같은가 비교하면 될듯하다.
- 가장 작은 생성자를 구하면 되므로 반복문을 돌리다 생성자를 찾았을 경우 반복문을 탈출하여주면 최솟값만 구할 수 있다.
- cout해줄 변수의 값에 0을 초기화해주고 값이 나올 경우 변수의 값에 대입을 해주면 될 듯하다. 못 찾았을 경우 그대로 0이 출력되기 때문이다.
2. 구상한 아이디어를 바탕으로 코딩하기
#include <iostream>
int main()
{
using namespace std;
int N;
cin >> N; // N 의 값을 입력받는다.
int num = 0;
//N보다 작은 모든 수의 분해합을 탐색한다.
for (int i = 1; i < N; i++)
{
int sum = i;
int temp = i;
/*
temp라는 변수를 따로 설정해주지 않고 i를 while 문에서 사용하면
계속 i가 0이 되어 무한히 반복되는 루프가 생성되기 때문에 i 값을 temp에
복사해주는 것이다.
*/
while (1)
{
sum += temp%10;
temp /= 10;
if (temp == 0)
break;
}
if (sum == N)
{
num = i;
break; // 문제에서 최솟값을 구하기만 하면 되는 것이므로 반복문을 탈출해준다.
}
}
cout << num << endl;
return 0;
}
처음에 21번 라인의 while 문에서 temp 변수를 따로 설정해주지 않고 i를 그대로 사용하였다. 그 결과 무한루프를 돌게 되었고, 디버깅을 통해 문제점을 확인할 수 있었다. 반복문에서 반복을 위해 사용하는 변수를 함부로 건들면 위험할 수 있다는 교훈을 얻었다.
// 피드백 및 문제사항 제기 언제든지 감사히 받겠습니다.
728x90
'Computer Science > Algorithm' 카테고리의 다른 글
(C++) 백준 11729번 [하노이 탑 이동 순서] (0) | 2021.02.21 |
---|---|
(C++) 백준 15686번 [치킨 배달] (0) | 2021.02.21 |
(C++) 백준 2960번 [에라토스테네스의 체] (0) | 2021.02.18 |
(C++) 백준 2798번 [블랙잭] (0) | 2021.02.12 |
(C++) 백준 1475번 [방 번호] (0) | 2021.02.11 |