백준의 4673번 문제인 셀프넘버이다.
10000 이하의 생성자가 없는 숫자를 출력하는 것이 목표이다.
입력은 없고 출력만 있다.
이로 인해 숫자 N값을 넣어 출력시키면 된다 생각했다.
일단 생성자를 구할 수 있는 메서드를 어떻게 구현할지 생각을 해 보았는데,
첫번째로 10,000 이하의 정수만 생각한다 하여 1000의 자리 숫자, 100의자리 숫자, 10의자리 숫자, 1의자리 숫자를 구할 수 있는 방법을 생각했다.
1000의 자리 숫자 : 입력된 값에 1000을 나눈 몫
100의 자리 숫자 : 입력된 값에 100을 나누어 나온 몫에 10을 나누어 나온 나머지
10의 자리 숫자 : 입력된 값에 10을 나누어 나온 몫에 10을 나누어 나온 나머지
1의 자리 숫자 : 입력된 값에 10을 나누어 나온 나머지
로 생각하였다.
추가로 어차피 입력된 숫자가 100의 자리 숫자여도, 1000으로 나눌 경우 1000의자리 숫자는 0이 나오기 때문에 이렇게 계산식을 적었다.
모든 연산을 마친 후 나온 모든 자리 숫자와 입력된 수를 더해 나온 결과값을 반환해주는 메서드를 만들었다.
그리고, 나는 첫번째 n의 값을 1로 정해준 후 생성자를 출력시킬 수 있는 방법을 생각해 보았다.
일단 n의 값을 1로 두고, 반환된 값을 n으로 두면 모든 생성자가 나올 수 있지 않을까 생각했다. 하지만, n = 2일 경우의 생성자, n = 3일경우의 생성자들이 모두 다를거라 생각되었고, n = result 가 아닌 n을 1씩 증가시켜 생성자를 받아올 수 있도록 했다. (ArrayList에 add하여 중복값을 제거했다.)
나는 1 ~ 10000까지의 숫자를 담은 ArrayList에서 생성자를 모두 remove해주는 방법을 생각했다.
for문을 이용해 1 ~ 10000까지의 숫자를 모두 담고,
위와 같이 생성자를 구하는 메서드를 통해 나온 값들을 ArrayList에 담았다.
위와같이 1 ~ 10000까지의 숫자가 담긴 ArrayList에서 생성자 값들을 remove시켜주었고,
생성자가 없는 모든 값들을 출력시켜주었다.
결과는 정답이다!
전체코드
import java.util.ArrayList;
import java.util.List;
public class problem4673 {
public static void main(String[] args) {
int n = 1;
int result = 0;
List<Integer> arr = new ArrayList<>(); // 1 ~ 10000까지 있는 List
List<Integer> self_arr = new ArrayList<>(); // 생성자가 있는 수를 담을 List
for(int i = 1; i <= 10000; i++) {
arr.add(i);
}
while(n < 10000) {
result = self_number(n);
self_arr.add(result);
n++;
}
for(int i = 0; i < self_arr.size(); i++) {
arr.remove(self_arr.get(i));
}
for(int i = 0; i < arr.size(); i++) {
System.out.println(arr.get(i));
}
}
// 생성자가 있는 함수 만들기
static int self_number(int n) {
int n_1000 = n / 1000;
int n_100 = (n/100) % 10;
int n_10 = (n/10) % 10;
int n_1 = n % 10;
int result = n + n_1000 + n_100 + n_10 + n_1;
return result;
}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스(LV2), JAVA]오픈채팅방 (0) | 2022.08.24 |
---|---|
[프로그래머스(LV2), JAVA]문자열 압축 (0) | 2022.08.23 |
[프로그래머스(Lv2), JAVA]두 큐 합 같게 만들기 (0) | 2022.08.22 |
[JAVA]백준 1157 - 단어 공부 (0) | 2022.08.17 |
[JAVA]백준 1065 - 한수 (0) | 2022.08.11 |