일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 텐션 업 10기!
- 우유가옆으로넘어지면아야
- SSAFY IM/A
- Hamming weight
- 네트워크
- DFS
- DP
- 자고 싶다
- 자료구조
- 모르고리즘
- amazon
- BFS
- 텐션 업 10기 화이팅
- SeongSeobDang
- 아자아자 화이팅
- 코로나 싫어요
- SSAFY 10기 화이팅
- Have a nice day.
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- have a nice day
- SSAFY 테스트
- 우유아야
- Have a good day :)
- Java 환경 설정
- I am Korean
- 우유가 옆으로 넘어지면 아야
- HAVE A GOOD DAY
- SSAFY 화이팅
- 수학
- Today
- Total
Hope Everyone Is Happy
[실버5] 4673. 셀프 넘버 (Java) 본문
https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
알고리즘 푸는 것도 재밌지만 곧 사이드 프로젝트도 진행 하도록 하겠습니다..!
해당 문제는 1949년 인도 수학자 D.R Kaprekar 님께서 이름을 붙인 셀프 넘버라는 규칙을 이용한 문제입니다.
셀프 넘버 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의 했을 떄 ( Ex d(75) = 75 + 7 + 5 = 82 ) 해당 규칙을 통해, n, d(n), d(d(n)).... 등의 순서로 무한히 수열을 만들 수 있다고 가정 합니다. ex) 33 + 3 = 39 이고 그 다음 수 는 51 + 5 +1 = 57 이런 식으로 수열을 만들면 33, 39, 51, 57, 69, 84...으로 가정한다고 보시면 될 것 같습니다.
이렇게 가정했을 때 n을 d(n)의 생성자라고 가정합니다. 예를 들면, 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자입니다. 생성자가 한 개보다 많은 경우도 있습니다! 예를 들어, 101은 생성자가 2개가 있네요! -> 91 (91 + 9 + 1)과 100 (100 + 1 + 0 + 0).
이 떄 생성자가 없는 숫자를 셀프 넘버라고 합니다. 이 규칙을 이용해 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력합니다.
Example :
◈ 100 보다 낮은 수 중 셀프 넘버
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
◈ Output ( 10000 보다 작은 셀프 넘버 )
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
저 같은 경우는 boolean 배열을 활용하여, 셀프 넘버가 아닌 경우는 true로 체크하여 코드를 작성하였습니다.
코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 1부터 10000까지의 수를 받아, 셀프 넘버에 해당되지 않는 수를 인덱스로 받는 boolean 배열을 true로 변경
▶ 셀프 넘버 계산은 1부터 10000 까지 각 수와 각 자리수의 숫자를 더하여 계산.
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
boolean[] bArr = new boolean[10000];
for(int i = 1; i < 10000; i++) {
int nTemp = i;
int nSum = i;
while(nTemp > 0) {
nSum += nTemp % 10;
nTemp /= 10;
}
if(nSum < 10000)
bArr[nSum] = true;
}
for(int j = 1; j < 10000; j++) {
if(!bArr[j])
System.out.println(j);
}
}
}
오늘은 코드 보다 문제 설명이 더 길었네요!! 일정이 있다보니 비교적 간단하게 풀려고 골랐는데 생각보다 시간이 걸렸습니다. 억울쓰..
긴 글 읽어주셔서 감사합니다!
Good Luck! (피드백 고맙습니다)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[실버5] 7568. 덩치 (Java) (0) | 2023.07.30 |
---|---|
[실버4] 2578. 빙고 (Java) (0) | 2023.07.28 |
[실버3] 17413. 단어 뒤집기2 (Java) (2) | 2023.07.26 |
[브론즈1] 2309. 일곱 난쟁이 (Java) (2) | 2023.07.25 |
[실버5] 1193. 분수찾기 (Java) (0) | 2023.07.24 |