[백준] 4673번: 셀프 넘버
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
Java 풀이
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] selfNums = new int[10001];
int len = selfNums.length;
int selfNum = 0;
for (int i = 1; i < len; ++i) {
selfNum = getSelfNum(i);
if(selfNum < len) {
selfNums[selfNum] = selfNum;
}
}
for (int i = 1; i < len; ++i) {
if (selfNums[i] == 0) {
bw.write(i +"\n");
}
}
bw.flush();
bw.close();
}
static int getSelfNum(int num) {
int total = num;
while (num != 0) {
total += num % 10;
num /= 10;
}
return total;
}
}
자바에서 배열 초기화 시 모든 값이 0이 된다.
검사 범위는 양의 정수이고, 10000 이하인 숫자이다. 따라서 0은 처음부터 비교에서 제외하였다.
셀프 넘버인 수를 구한 뒤 selfNum 배열에 저장한다. 배열에 저장된 값이 0인지 아닌지 비교만 하면 되므로 굳이 selfNums[selfNum] = selfNum;을 하지 않고 ++selfNums[selfNum]; 과 같이 해주어도 상관없다.
이후 배열을 처음부터 끝까지 검사해보며 0이 저장된 위치의 index 값이 셀프 넘버가 아닌 수이므로 출력한다.
int형 배열을 사용해 구현하였지만 boolean형 배열을 사용해 구현할 수도 있다.
앞서 봤듯이 selfNums 배열에는 인덱스 값이 셀프 넘버인지, 아닌지만 구분하면 되기 때문이다.
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
boolean[] selfNums = new boolean[10001];
int len = selfNums.length;
int selfNum = 0;
for (int i = 1; i < len; ++i) {
selfNum = getSelfNum(i);
if(selfNum < len) {
selfNums[selfNum] = true;
}
}
for (int i = 1; i < len; ++i) {
if (selfNums[i] == false) {
sb.append(i).append("\n");
}
}
bw.write(sb + "");
bw.flush();
bw.close();
}
static int getSelfNum(int num) {
int total = num;
while (num != 0) {
total += num % 10;
num /= 10;
}
return total;
}
}
전체적인 소스 코드는 위 소스 코드와 동일하다.
selfNums 배열 타입이 boolean 형으로 바뀌었다는 것 정도이다.
추가로 속도 비교를 위해 StringBuilder를 사용해보았는데, for문 내에서 bw.write()를 계속해서 사용하는 것보다 StringBuilder에 값을 저장하고 bw.write()를 한 번만 출력하는 게 더 빨랐다.
Python 3 풀이
def getSelfNum(num):
total = num
while num != 0:
total += num % 10
num //= 10
return total
selfNums = [False for _ in range(10001)]
for i in range(1, 10001):
selfNum = getSelfNum(i)
if selfNum < 10001:
selfNums[selfNum] = True
for i in range(1, 10001):
if not selfNums[i]:
print(i)
[백준] 4673번: 셀프 넘버
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
Java 풀이
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] selfNums = new int[10001];
int len = selfNums.length;
int selfNum = 0;
for (int i = 1; i < len; ++i) {
selfNum = getSelfNum(i);
if(selfNum < len) {
selfNums[selfNum] = selfNum;
}
}
for (int i = 1; i < len; ++i) {
if (selfNums[i] == 0) {
bw.write(i +"\n");
}
}
bw.flush();
bw.close();
}
static int getSelfNum(int num) {
int total = num;
while (num != 0) {
total += num % 10;
num /= 10;
}
return total;
}
}
자바에서 배열 초기화 시 모든 값이 0이 된다.
검사 범위는 양의 정수이고, 10000 이하인 숫자이다. 따라서 0은 처음부터 비교에서 제외하였다.
셀프 넘버인 수를 구한 뒤 selfNum 배열에 저장한다. 배열에 저장된 값이 0인지 아닌지 비교만 하면 되므로 굳이 selfNums[selfNum] = selfNum;을 하지 않고 ++selfNums[selfNum]; 과 같이 해주어도 상관없다.
이후 배열을 처음부터 끝까지 검사해보며 0이 저장된 위치의 index 값이 셀프 넘버가 아닌 수이므로 출력한다.
int형 배열을 사용해 구현하였지만 boolean형 배열을 사용해 구현할 수도 있다.
앞서 봤듯이 selfNums 배열에는 인덱스 값이 셀프 넘버인지, 아닌지만 구분하면 되기 때문이다.
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
boolean[] selfNums = new boolean[10001];
int len = selfNums.length;
int selfNum = 0;
for (int i = 1; i < len; ++i) {
selfNum = getSelfNum(i);
if(selfNum < len) {
selfNums[selfNum] = true;
}
}
for (int i = 1; i < len; ++i) {
if (selfNums[i] == false) {
sb.append(i).append("\n");
}
}
bw.write(sb + "");
bw.flush();
bw.close();
}
static int getSelfNum(int num) {
int total = num;
while (num != 0) {
total += num % 10;
num /= 10;
}
return total;
}
}
전체적인 소스 코드는 위 소스 코드와 동일하다.
selfNums 배열 타입이 boolean 형으로 바뀌었다는 것 정도이다.
추가로 속도 비교를 위해 StringBuilder를 사용해보았는데, for문 내에서 bw.write()를 계속해서 사용하는 것보다 StringBuilder에 값을 저장하고 bw.write()를 한 번만 출력하는 게 더 빨랐다.
Python 3 풀이
def getSelfNum(num):
total = num
while num != 0:
total += num % 10
num //= 10
return total
selfNums = [False for _ in range(10001)]
for i in range(1, 10001):
selfNum = getSelfNum(i)
if selfNum < 10001:
selfNums[selfNum] = True
for i in range(1, 10001):
if not selfNums[i]:
print(i)