728x90
단계별로 풀어보기 - 함수 - [2단계] 4673번
문제
문제 링크 : www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
풀이
다음과 같이 함수를 사용하지 않고 코드를 작성했었지만,
#include <iostream>
using namespace std;
int main() {
int num[10000] = { 1, };
int temp;
for (int i = 0; i < 10000; i++) {
if (i < 10)
num[i + i] = 1;
else if (i < 100)
num[i + i / 10 + i % 10] = 1;
else if (i < 1000)
num[i + i / 100 + i % 100 / 10 + i % 10] = 1;
else if (i < 10000) {
temp = i + i / 1000 + i % 1000 / 100 + i % 100 / 10 + i % 10;
if (temp < 10000)
num[temp] = 1;
}
}
for (int i = 1; i < 10000; i++) {
if (!num[i])
cout << i << endl;
}
}
이번에 새로 단계별 풀이 목적에 맞춰! 함수를 사용하여 작성했습니다.
문제에서 정의한 n과 n의 각 자리수를 더하는 d(n)함수를 구현하고,
모든 수에 대해 d(n) 함수를 실행하여 셀프넘버가 아닌 수를 true로 설정하는 self_number()함수를 작성했다.
메인문에서는 self_number()를 한번 실행하고 self_number 여부를 저장한 배열을 출력만 할 수 있도록 하였다.
이와 같이 함수를 사용하면 메인문에서 필요한 기능에 따라 함수를 호출, 사용하여 가독성 좋은 코드를 작성할 수 있다.
함수의 재사용을 쉽게 하기 위해서는 함수의 기능이 잘 나타나도록 함수 이름을 정하는 것 또한 중요하다.
CODE
#include <iostream>
using namespace std;
bool num[10001];
int d(int n) {
int temp;
temp = n + n / 1000 + n % 1000 / 100 + n % 100 / 10 + n % 10;
return temp;
}
void self_number() {
int temp;
num[1] = false;
for (int i = 0; i < 10000; i++) {
if (i < 10000) {
temp = d(i);
if (temp < 10000)
num[temp] = true;
}
}
}
int main() {
self_number();
for (int i = 1; i < 10000; i++)
if (!num[i])
printf("%d\n", i);
}
결과
728x90
'Baekjoon > 단계별로 풀어보기' 카테고리의 다른 글
[BOJ/백준] 11654번 아스키 코드 C++ 문제 풀이 (0) | 2020.09.22 |
---|---|
[BOJ/백준] 1065번 한수 C++ 문제 풀이 (0) | 2020.09.22 |
[BOJ/백준] 15596번 정수 N개의 합 C++ 문제 풀이 (0) | 2020.09.22 |
[BOJ/백준] 4344번 평균은 넘겠지 C++ 문제 풀이 (0) | 2020.09.22 |
[BOJ/백준] 8958번 OX퀴즈 C++ 문제 풀이 (0) | 2020.09.21 |