์ฝ”๋”ฉํ…Œ์ŠคํŠธ/BOJ

[๋ฐฑ์ค€ 1463] -1๋กœ๋งŒ๋“ค๊ธฐ(C++)/๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

kite707 2021. 7. 29.

https://www.acmicpc.net/problem/1463

 

1463๋ฒˆ: 1๋กœ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 106๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

์ ‘๊ทผ์€ ์ž˜ ํ–ˆ๋Š”๋ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ๊ฐ ๋น„๊ตํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ๋‹ต์„ ๋‚ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ„๊ณผํ•ด์„œ ํ•œ์ฐธ ํ—ค๋งจ ๋ฌธ์ œ์ด๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

๊ฐ ์ˆ˜๋ฅผ 1๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋‚˜์—ดํ•ด ๋ณด์•˜๋‹ค.

์ž…๋ ฅ 1 2 3 4 5 ... 8 9 10
์—ฐ์‚ฐ ํšŸ์ˆ˜ 0 1 1 2 3 ... 3 2 3

์ ํ™”์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ธ์› ์—ˆ๋‹ค.

  • n=1์ด๋ฉด 0
  • 3์œผ๋กœ ๋‚˜๋ˆ ์งˆ ๋•Œ : f(x)=1+f(x/3)
  • 2๋กœ ๋‚˜๋ˆ ์งˆ ๋•Œ : f(x)=1+f(x/2)
  • ๋‘ ์ˆ˜๋กœ ๋‚˜๋ˆ ์ง€์ง€ ์•Š์„ ๋•Œ : f(x)=f(x-1)+1

 

์ด๋Ÿฐ์‹์œผ๋กœ ์„ธ์› ์—ˆ๋‹ค. ์ ์šฉํ•ด๋ณด๋ฉด f(5)=1+f(4)=1+2=3 ์ด๋Ÿฐ์‹์œผ๋กœ ๋ง์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 10์˜ ๊ฒฝ์šฐ ์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์‚ฐ์„ ํ•˜๋ฉด f(10)=1+f(5)=4๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” f(10)=1+f(9)=3์ด ๋” ๋น ๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค ๊ตฌํ•ด๋ณธ ๋’ค ๋‘˜ ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์ฑ„ํƒํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

#include <iostream>
using namespace std;
int arr[1000001];

int init = 0;

int number(int x) {
	if (x == 1) {
		return 0;
	}
	if (arr[x] != 0) {
		return arr[x];
	}

	int res= 1 + number(x - 1);
	if (x % 3 == 0) res = min(res, 1 + number(x / 3));
	if (x % 2 == 0) res = min(res, 1 + number(x / 2));
	arr[x] = res;
	return res;
	

}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	arr[2] = 1;
	arr[3] = 1;
	cin >> init;

	cout << number(init);


}

 

๋Œ“๊ธ€