π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_브루트포슀

[Baekjoon/λ°±μ€€][4673][C/C++] μ…€ν”„ λ„˜λ²„

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 18.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

ν•΄λ‹Ή 문제의 μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜ 쀑 ν•˜λ‚˜λŠ” '브루트포슀 μ•Œκ³ λ¦¬μ¦˜'으둜, λͺ¨λ“  경우의 수λ₯Ό 일일이 따져보며 ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμ΄λ‹€. λ¬Έμ œμ— μ œμ‹œλœ self number에 λŒ€ν•œ κ°œλ…λ§Œ μ΄ν•΄ν•œλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ΄λ‹€.

1. 문제

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κ°€ 이름 λΆ™μ˜€λ‹€. μ–‘μ˜ μ •μˆ˜ 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]

μ—†μŒ.

[예제 좜λ ₯ 1]

1
3
5
7
9
20
31
42
53
64
 |
 |       <-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

2. 풀이

μš°μ„ , Self Number에 λŒ€ν•˜μ—¬ 이해해 보자. 

$d(1)$  $=1+1$ $=2$ 1은 2의 μƒμ„±μž
[2 : μ…€ν”„λ„˜λ²„X]
$d(2)$ $=2+2$ $=4$ 2λŠ” 4의 μƒμ„±μž
[4 : μ…€ν”„λ„˜λ²„X]
$d(3)$ $=3+3$ $=6$ 3은 6의 μƒμ„±μž
[6 : μ…€ν”„λ„˜λ²„X]
...      
$d(41)$ $=41+4+1$ $=46$ 41은 46의 μƒμ„±μž
[46 : μ…€ν”„λ„˜λ²„X]
...      
$d(9999)$ $=9999+9+9+9+9$ $=10035$ 9999λŠ” 10035의 μƒμ„±μž
[10035 : μ…€ν”„λ„˜λ²„X]
$d(10000)$ $=10000+1+0+0+0+0$ $=10001$ 10000은 10001의 μƒμ„±μž
[10001 : μ…€ν”„λ„˜λ²„X]

Self Number의 μ›λ¦¬λŠ” μœ„μ™€ κ°™λ‹€.

 

d(1)λΆ€ν„° d(10000)κΉŒμ§€μ˜ 값을 κ΅¬ν•˜λ©΄ 10000 μ΄ν•˜μ˜ Self Numberκ°€ μ•„λ‹Œ λͺ¨λ“  μˆ˜κ°€ ꡬ해진닀. (∡d(10000)λΆ€ν„°λŠ” κ·Έ 값이 무쑰건 10000을 λ„˜μ–΄κ°€κΈ° λ•Œλ¬Έ.) λ”°λΌμ„œ, 길이가 10000인 배열을 λ§Œλ“  ν›„ (indexκ°€ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•œλ‹€ κ°€μ •ν–ˆμ„ λ•Œ 길이가 10000이닀. cμ—μ„œλŠ” 길이가 10001인 배열을 λ§Œλ“€μ–΄μ•Ό 1λ²ˆλΆ€ν„° 10000λ²ˆκΉŒμ§€μ˜ 수λ₯Ό λ‹€λ£° 수 μžˆλ‹€.) Self Number에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 번호λ₯Ό μ§€μ›Œκ°€λ‹€ 보면, λ§ˆμ§€λ§‰μ—” Self Number에 ν•΄λ‹Ήν•˜λŠ” 번호만이 λ‚¨κ²Œ λœλ‹€. 

 

배열은 λ‹¨μˆœ 체크 μš©λ„μ΄λ―€λ‘œ, μžλ£Œν˜•μ΄ bool인 배열을 μ„ μ–Έν•˜μ—¬ trueㆍfalse μ—¬λΆ€λ§Œ νŒλ‹¨ν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€. μžμ„Έν•œ κ΅¬ν˜„ λ‚΄μš©μ€ 주석을 μ°Έκ³  λ°”λž€λ‹€.

3. μ½”λ“œ

#pragma warning (disable:4996)
#include <stdio.h>
#include <stdbool.h>//bool μžλ£Œν˜• μ‚¬μš© λͺ©μ 

bool flag[10001]; 
/* 
main ν•¨μˆ˜ 내뢀에 λ°°μ—΄ μ„ μ–Έ μ‹œ, μŠ€νƒμ˜μ—­ λ©”λͺ¨λ¦¬ 초과둜 μ‹€ν–‰ μ•ˆλ¨.
λ”°λΌμ„œ, μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ—¬ λ°μ΄ν„°μ˜μ—­μ— 할당해야함.
*/

int d(int n) {
	return n + (n % 10) + ((n / 10) % 10) + ((n / 100) % 10) + ((n / 1000) % 10);
}
/*
λ”μš± λ²”μš©μ (일반적)인 λ°©λ²•μœΌλ‘œ dν•¨μˆ˜λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆμ§€λ§Œ,
μ—¬κΈ°μ„œλŠ” 10000 μ΄ν•˜μ˜ 수둜 λ²”μœ„κ°€ μ œν•œλ˜μ–΄ μžˆμœΌλ―€λ‘œ, 
ν•΄λ‹Ή μƒν™©μ—μ„œλ§Œ ν•¨μˆ˜κ°€ μž‘λ™ν•˜λ„λ‘ μ½”λ“œλ₯Ό μ„€κ³„ν•˜μ˜€λ‹€.
*/

int main(int argc, char* argv[]) {

	for (int i = 1; i <= 10000; i++)
		flag[d(i)] = true;	//self number에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 값을 true둜 λ³€κ²½.

	for (int i = 1; i <= 10000; i++)
		if (flag[i] == false)	//self number에 ν•΄λ‹Ήν•˜λŠ” 값은 false이닀.
			printf("%d\n", i);

	return 0;
}
728x90
λ°˜μ‘ν˜•