4673번 - 셀프 넘버
<코드 설명>
- 크기가 10000인 int 배열 선언하기
- for문을 사용하여 셀프 넘버 찾기
- 셀프 넘버의 배열 값은 0, 셀프 넘버가 아닌 배열 값은 1
- 배열 값이 0인(셀프 넘버)만 출력
#include <iostream>
using namespace std;
int main() {
int num[10000] = { 1, };
int tmp;
for (int i = 1; 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 % 100 % 10] = 1;
}
else if (i < 10000) {
tmp = i + i / 1000 + i % 1000 / 100 + i % 1000 % 100 / 10 + i % 1000 % 100 % 10;
if (tmp < 10000) num[tmp] = 1;
}
}
for (int i = 1; i < 10000; i++) {
if (num[i] == 0) cout << i << '\n';
}
return 0;
}
num배열의 index 0은 생성자를 통해 만들어질 수 없는 숫자이기에 배열 값을 1로 선언합니다.
for문 안에서 10, 100, 1000, 1000보다 작은 i값으로 범위를 정해서 셀프 넘버를 찾았습니다.
i값이 10보다 작을 경우는 (i + i) 인덱스 값에 1을 넣어주고,
i값이 100보다 작을 경우는 (i + i / 10 + i % 10) 인덱스 값에 1을 넣어주고,
i값이 1000보다 작을 경우는 (i + i / 100 + i % 100 / 10 + i % 100 % 10) 인덱스 값에 1을 넣어주고,
i값이 10000보다 작을 경우는 (i + i / 1000 + i % 1000 / 100 + i % 1000 % 100 / 10 + i % 1000 % 100 % 10) 인덱스 값에 1을 넣어줍니다. 이때, i값이 10000보다 작을 경우는 인덱스가 10000보다 작은 경우에만 인덱스의 배열 값에 1을 넣어줘야 합니다. 인덱스가 10000보다 클 경우 배열의 크기를 넘어서기 때문에 비정상적인 종료가 일어납니다.
이 문제를 풀 때 가장 중요하게 생각해야 할 부분은 생성자를 통해 인덱스를 찾는 과정이라고 생각합니다. 그리고 인덱스 값이 배열의 크기를 초과하지 않는지 확인하는 부분도 중요하다고 생각합니다.
이 두 가지만 주의한다면 비교적 쉽게 문제를 풀 수 있다고 생각합니다.
감사합니다!
2022.10.06
'Baekjoon' 카테고리의 다른 글
[백준 C++] 9095번 - 1, 2, 3 더하기 (0) | 2022.01.13 |
---|---|
[백준 C++] 1152번 - 단어의 개수 (0) | 2022.01.09 |
[백준 C++] 10817번 - 세 수 (0) | 2022.01.03 |
[백준 C++] 10809번 - 알파벳 찾기 (0) | 2022.01.03 |
[백준 C++] 1157번 - 단어공부 (0) | 2021.12.31 |