Self Number 찾기
대엽님 블로그에서 퀴즈를 발견하고 원문을 보고 풀었는데 원문에는 파이썬 코드인지 모르는 문법이라 그런가 눈에 잘 안들어오네요. 대엽님이 푼 코드는 자바여서 역시 눈에 잘 들어오더군요. 문제를 다르게 풀 수 있을 것 같아서 코딩을 해봤습니다.
저는 1~4999까지 배열을 만들고 Generated 숫자가 될 수 있는 것들[footnote]다른 말로 generator를 가지고 있는 수[/footnote]을 지워나갔습니다.[footnote]해당 index안에 들어있는 수를 0으로 만들었습니다.[/footnote] 지우고 남는 숫자들이 Self Number들이기 때문에 나중에 배열에 들어있는 수를 쫙 더해주면 됩니다.
[#M_ more.. | less.. | public class SumOfSelfNumber {
public static void main(String[] args) {
new SumOfSelfNumber().start();
}
private void start() {
int[] numbers = makeArray();
checkSelfNumber(numbers);
System.out.println(addAllSelfNumber(numbers));
}
private int[] makeArray() {
int[] numbers = new int[4999];
for (int i = 1; i < 5000; i++) {
numbers[i-1] = i;
}
return numbers;
}
private void checkSelfNumber(int[] numbers) {
for (int i = 0 ; i < numbers.length ; i++) {
int generatedNumber = 0;
generatedNumber = generate(i+1);
if (generatedNumber != 0 && generatedNumber < 5000) {
numbers[generatedNumber - 1] = 0;
}
}
}
private int generate(int number) {
char[] chars = new String(number+"").toCharArray();
int[] ints = new int[chars.length + 1];
ints[0] = number;
for (int j = 1; j < ints.length; j++) {
ints[j] = (int)chars[j-1] - 48;
}
int generatedNumber = 0;
for (int i = 0; i < ints.length; i++) {
generatedNumber += ints[i];
}
return generatedNumber;
}
private long addAllSelfNumber(int[] numbers) {
long sum = 0;
for(int i : numbers)
sum += i;
return sum;
}
}_M#]
코딩할 때 불편한 점은 int -> char -> int 이 과정에서 숫자가 변질 되는데 이것좀 어떻게 편하게 바꿀 수 있는 방법이 없을지 궁금하네요.
대엽님 코드를 보니 (int)c - (int)'0' 이런 방법으로 char 안에 들어간 int값을 그대로 살려냈는데 저도 마찬가지로 (int)chars[j-1] - 48 이런식으로 int값을 살려냈습니다. 좋은 방법 아시는 분~