-
220227_JAVA_코딩테스트 연습5. 그 외 공부/5.2 코딩테스트 2022. 2. 27. 11:10
출처 : https://codingdojang.com/scode/365?answer_mode=hide (코딩도장)
<문제>
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.
예를 들어
d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.
1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.
<문제풀이>
1. 클래스 파일 생성 : SelfNum
class SelfNum{
2. 변수 선언 :
- 범위가 5000까지니까 1의자리~1000의 자리까지의 숫자를 넣을 int형의 변수 (int a,b,c,d)
int a,b,c,d;
- 제너레이터를 도출할 정수형 타입의 generator 변수
int generator;
- 셀프넘버는 제너레이터의 반대의 수이므로 true/false 로 구분=> boolean[] bool = new boolean[5000-1+1] 활용
(5000-1+1 : 1~5000사이의 수)
boolean[] bool = new boolean[5000-1+1];
제너레이터는 boolean 배열에 넣어주어 true 값으로 대입하게 할것이며, 나머지 false 값이 셀프넘버일것
- 셀프넘버의 합을 구할 int형 sum 변수 선언
int sum = 0;
3. 기본생성자 생성
SelfNum(){}
4. 메소드 생성
public void print(){
5. 반복문 실행 : 1부터 5000 사이의 수의 generator를 구하기 위해서는 반복적으로 각 자리의 수를 더해야 하므로..
for(int i = 1;i<num;i++) {6. 각 자릿수 도출 : 나는 a : 1000의 자리 수, b : 100의 자리 수, c : 10의 자리수 , d : 1의자리수 로 할 예정.
( 예: i가 3333이면 1000으로 나누게 되면 int로 3.333이지만 a는 int형이므로 int로 자동 형변환이 되어 소수점 아래숫자는 없어짐. 도출된 3에 10의 나머지는 3 이다... 이렇게 반복적으로 다른 자릿수도 구해주면 된다.)
a = (i/1000)%10;
b = (i/100)%10;
c = (i/10)%10;
d = i%10;
7. 각 자리수의 숫자를 더한 후 본인 수까지 더한 수.. generator 변수에 담기
ex) generator=> 3+3+3+3+3333
generator = a+b+c+d+i;
8. 반복문 생성 : generator 값이 1에서 5000 사이의 수라면 boolean 배열의 true 값으로 반환
if(generator>0&&generator<5000) {bool[result] = true;}9. 그러므로 제너레이터는 boolean 배열이 bool[result]값에 true로 반환됨, 반복문 빠져나가기
}
10. 우리가 구하고 싶은 것은 제레이터 값이 아닌, 셀프넘버 이기 때문에 위에서 true로 반환하였던 boolean 배열의 제너레이터 값의 false 값을 구해줘야 한다.11. 1부터 5000 사이의 범위로 반복문 실행!
for(int i = 1; i<5000;i++) {
12. 8번에서 제너레이터 값은 true 값으로 반환하였기 때문에 그 반대의 수를 구하기 위해 gene 배열의 false 값을 도출해줘야함.
if(gene[i]==false) {sum+=i;}
13. 1~5000 사이의 셀프넘버를 sum에 더해줌 sum += i ==> sum = sum+i가 계속 누적해서 반복해서 더해지는 것이다.
14. 반복문 빠져나감
}
System.out.println("1부터 5000까지의 셀프넘버의 합은? : ["+sum+"] 입니다.");15. print 메소드 빠져나감
}
}
16. SelfNum은 셀프 넘버를 도출하기 위한 설계도 였으며 이 설계도를 표현하기 위해 main 클래스에서 객체 생성
public class Main {
public static void main(String[] args) {17. selfnum 이라는 임의의 인스턴스 생성
SelfNum selfnum = new SelfNum();18. SelfNum 객체의 print 메소드 불러오기
g1.print();
}
}'5. 그 외 공부 > 5.2 코딩테스트' 카테고리의 다른 글
220505_JAVA_코딩 테스트 문제(로또의 최고 순위와 최저 순위) (0) 2022.05.05 220505_JAVA_코딩 테스트 문제(신규 아이디 추천) (0) 2022.05.05 220417_JAVA_코딩테스트 연습 (0) 2022.04.17 220326_JAVA_코딩테스트 연습 (0) 2022.03.26 220227_JAVA_코딩테스트 연습 (0) 2022.02.27