내 풀이
public class 셀프넘버 {
public static void main(String[] args) {
//전체 수
int[] wholeNum = new int[10000];
for(int i = 0; i < 10000; i++) {
wholeNum[i] = (i + 1);
}
//d 수
int[] dNum = new int[10000];
for(int j = 0; j < 10000; j++) {
dNum[j] = d(j);
}
//비교
for(int a = 0; a < 10000; a++) {
int noDNum = 0;
int count = 0;
for(int b = 0; b < 10000; b++) {
if(wholeNum[a] == dNum[b]) {
count += 1;
}
}
if(count == 0) {
noDNum = wholeNum[a];
}
if(noDNum != 0) {
System.out.println(noDNum);
}
}
}
//d(n) method
public static int d(int number) {
int result = 0;
String stringNum = number + "";
for(int i = 0; i < stringNum.length(); i++) {
result += Character.getNumericValue(stringNum.charAt(i));
}
return (result + number);
}
}
회고
d(n) 숫자를 만드는 method를 신박하게 만들었음..😛
숫자 자리수와 관련된 문제는 / 연산자와 % 연산자 조합으로 풀면 훨씬 쉽게 풀 수 있음!
다른 풀이
백준에 제출된 다른 사람들의 풀이를 토대로 나에게 맞춰 변경해보았음.
public class Main {
public static void main(String[] args) {
//문제에서는 10000이하만 보면 되지만, 다른 수일때도 쉽게 확인해보기 위해 변수 생성
int totalNum = 10000;
//true, false 알려주는 flag를 모아둔 array 제작
boolean[] flags = new boolean[totalNum];
//index와 숫자를 연결하여 생각하는 방법
for(int i = 0; i < flags.length; i++) {
int dNum = d(i + 1);
if(dNum <= totalNum) {
flags[dNum - 1] = true;
}
}
for(int j = 0; j < flags.length; j++) {
if(!flags[j]) {
System.out.println((j + 1));
}
}
}
//d(n) 찾기
public static int d(int num) {
int sum = num;
while(num > 0) {
sum += (num % 10);
num /= 10;
}
return sum;
}
}
시사점
1) true와 false 상태를 알려주는 flag들을 array에 담아 사용할 수 있음
2) 배열로 연속된 숫자들을 다룰 때(?) 또는 배열과 연속된 숫자가 같이 다뤄지는 문제에서는 배열의 index number를 숫자와 연결지어 사용하면 좋다. (index = 0 은 숫자 1, index = 1 은 숫자 2 ,,,이런 식으로! for loop 돌릴 때 유용할 듯.)
여러 시사점을 얻은 문제👏👏👏
문제 링크: https://www.acmicpc.net/problem/4673
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[Swift] 1712 손익분기점 (0) | 2022.02.09 |
---|---|
2438-별 찍기 - 1 (0) | 2022.01.26 |
11021-A+B-7 (0) | 2022.01.26 |
2739-구구단 (0) | 2022.01.26 |