μ•Œκ³ λ¦¬μ¦˜ 문제/BOJ_Java

[BOJ/Step6] 4673 : μ…€ν”„ λ„˜λ²„ (JAVA)

NaNaRinπŸ™ƒ 2021. 1. 10. 22:19

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κ°€ 이름 λΆ™μ˜€λ‹€. μ–‘μ˜ μ •μˆ˜ n에 λŒ€ν•΄μ„œ d(n)을 nκ³Ό n의 각 자리수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜λΌκ³  μ •μ˜ν•˜μž. 예λ₯Ό λ“€μ–΄, d(75) = 75+7+5 = 87이닀.

μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 수λ₯Ό μ‹œμž‘ν•΄μ„œ n, d(n), d(d(n)), d(d(d(n))), ...κ³Ό 같은 λ¬΄ν•œ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. 

예λ₯Ό λ“€μ–΄, 33으둜 μ‹œμž‘ν•œλ‹€λ©΄ λ‹€μŒ μˆ˜λŠ” 33 + 3 + 3 = 39이고, κ·Έ λ‹€μŒ μˆ˜λŠ” 39 + 3 + 9 = 51, λ‹€μŒ μˆ˜λŠ” 51 + 5 + 1 = 57이닀. μ΄λŸ°μ‹μœΌλ‘œ λ‹€μŒκ³Ό 같은 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 μƒμ„±μžλΌκ³  ν•œλ‹€. μœ„μ˜ μˆ˜μ—΄μ—μ„œ 33은 39의 μƒμ„±μžμ΄κ³ , 39λŠ” 51의 μƒμ„±μž, 51은 57의 μƒμ„±μžμ΄λ‹€. μƒμ„±μžκ°€ ν•œ κ°œλ³΄λ‹€ λ§Žμ€ κ²½μš°λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 101은 μƒμ„±μžκ°€ 2개(91κ³Ό 100) μžˆλ‹€. 

μƒμ„±μžκ°€ μ—†λŠ” 숫자λ₯Ό μ…€ν”„ λ„˜λ²„λΌκ³  ν•œλ‹€. 100보닀 μž‘μ€ μ…€ν”„ λ„˜λ²„λŠ” 총 13κ°œκ°€ μžˆλ‹€. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

μž…λ ₯은 μ—†λ‹€.

 

좜λ ₯

10,000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯

 

예제 좜λ ₯

1

3

5

7

9

20

31

42

53

64

| | <-- a lot more numbers |

9903

9914

9925

9927

9938

9949

9960

9971

9982

9993


풀이

1. 1λΆ€ν„° 10000 μ‚¬μ΄μ˜ 수 쀑에 각 자리수λ₯Ό λ”ν•œ 값은 λͺ¨λ‘ μƒμ„±μžκ°€ μ‘΄μž¬ν•œλ‹€.

    λ”°λΌμ„œ 1λΆ€ν„° 10000 μ‚¬μ΄μ˜ 수 쀑 각 자리 수λ₯Ό λ”ν•œ 값이 μ•„λ‹Œ μˆ˜λ“€μ€ μƒμ„±μžκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 수 일 것이닀.

2. 각 자리수λ₯Ό λͺ¨λ‘ 더해 λ¦¬ν„΄ν•΄μ£ΌλŠ” int d(int a)λ₯Ό μž‘μ„±

3. μƒμ„±μž μ—¬λΆ€λ₯Ό μ €μž₯ν•  boolean[10000] array 배열을 μƒμ„±ν•œλ‹€.  boolean λ°°μ—΄μ˜ λ””ν΄νŠΈκ°’μ€ false.

     => λ°°μ—΄μ˜ λ””ν΄νŠΈ κ°’

4. for(int i = 1; i < 10001; i++)

   4-1. d(i)κ°€ 10000을 λ„˜λŠ”μ§€ κ²€μ‚¬ν•œ ν›„ (1 - 10000 κΉŒμ§€μ˜ 수만 μƒμ„±μž μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜κΈ° λ•Œλ¬Έ)

   4-2. 10000 μ΄ν•˜μ˜ 수만 true둜 λ³€κ²½

5. 배열이 false 인 i κ°’λ§Œ 좜λ ₯

 

public class B4673 {

	public static void main(String[] args) {
		
		boolean[] array = new boolean[10001];
		
		for(int i = 1; i < 10001; i++) {
			int num = d(i);

			if(num < 10001) {
				array[num] = true;
			}
		}
		
		for(int i = 1; i < 10001; i++ ) {
			if(array[i] == false) {
				System.out.println(i);
			}
		}
	}
	
	public static int d(int a) {
		int result = a + a % 10 + a % 100 / 10 + a % 1000 / 100 + a % 10000 / 1000;	
		return result;
	}

}