Hello Ocean! ๐ŸŒผ

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””]์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ•ด๊ฒฐ์ „๋žต LIS ๋ณธ๋ฌธ

Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””]์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ•ด๊ฒฐ์ „๋žต LIS

bba_dda 2020. 4. 13. 01:33
๋ฐ˜์‘ํ˜•

[๋ฌธ์ œ]

์ฃผ์–ด์ง„ ์ˆ˜์—ด์— ๋Œ€ํ•ด ์ตœ๋Œ€ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ตฌํ•˜๊ธฐ.

์ตœ๋Œ€ ์ฆ๊ฐ€ ๋ถ€๋ถ„์ˆ˜์—ด์ด๋ž€?

- ์›์†Œ๋“ค์ด ์ˆœ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด ์ค‘์— ๊ฐ€์žฅ ๊ธด ๊ฒƒ

 

[ํ’€์ด] 

๋‚˜์˜ ํ’€์ด

n ํฌ๊ธฐ์˜ ์ˆ˜์—ด์— ๋Œ€ํ•ด n*n ํฌ๊ธฐ์˜ ์ด์ฐจ์› cache๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

์ด ๋ฌธ์ œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ„์™€ ๊ฐ™๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ maxCount๋ฅผ ์ƒˆ cache๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐฑ์‹ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š”, maxCount๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ์—์„œ ๋‚˜์˜ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ex) 5,3,4์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€์ฆ๊ฐ€๋ถ€๋ถ„์ˆ˜์—ด์€ 3,4๊ฐ€ ๋œ๋‹ค. 

๋”ฐ๋ผ์„œ ๋ชจ๋“  cache ๋‚ด๋ถ€์˜ ๊ฐ’์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„์•ผํ•˜๋Š”๋ฐ ์ด ๊ณผ์ •์„ ๊ณ„์‚ฐํ•  ๋•Œ ํ•œ๋ฒˆ์— ํ•˜๊ธฐ ์œ„ํ•ด์„œ maxCount๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

(๋’ค์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋” ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.)

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ข€ ๋” ๋ณต์žกํ•œ ์˜ˆ์‹œ๋ฅผ ์ ์šฉํ•ด๋ณด์ž.

1,3,2,4,6,8 ์˜ ์ˆ˜์—ด์— ๋Œ€ํ•œ cache๋ฅผ ๊ตฌํ•ด๋ณด์ž

๊ทœ์น™์„ ์ ์šฉํ•ด์„œ cache๋ฅผ ๋ชจ๋‘ ์ฑ„์šฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, cache ๋‚ด์˜ max๊ฐ’์— +1์„ ํ•ด์ค˜์•ผ ์ตœ์ข… output์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์™œ๋ƒํ•˜๋ฉด cache์—์„œ๋Š” ์ตœ๋Œ€๋ถ€๋ถ„์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ '์‹œ์ž‘์ '์˜ ์›์†Œ๋Š” ์„ธ์ง€ ์•Š๊ณ  ์ €์žฅํ•œ๋‹ค.

ex) 2๋ฒˆ์งธ ์›์†Œ ~ 5๋ฒˆ์งธ ์›์†Œ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š”

2๋ฒˆ์งธ ์›์†Œ ~ 4๋ฒˆ์งธ ์›์†Œ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด  + 4๋ฒˆ์งธ ์›์†Œ ~ 5๋ฒˆ์งธ ์›์†Œ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด ๊ฐ€ ๋œ๋‹ค.

์ด ๊ณผ์ •์—์„œ 4๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๋‘ ๋ฒˆ ์„ธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, cache์— ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์‹œ์ž‘์ง€์ ์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์ง€ ์•Š๊ณ  ์ €์žฅํ•˜์˜€๋‹ค. 

#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
	int n;
	int arr[101];
	int cache[101][101] = { 0, };
	scanf_s("%d", &n);
	for (int i = 0;i < n;i++)
		scanf_s("%d", &arr[i]);

	int maxCount=0;
	for (int i = n - 2;i >= 0;i--) {
		if (arr[i + 1] > arr[i])
			cache[i][i + 1] = 1;
		for (int j = 2;j < n - i;j++) {
			if (arr[i + j] > arr[i]) {
				cache[i][i + j] = cache[i][i + j - 1] + cache[i + j-1][i+j];
				if (cache[i][i + j] > maxCount)
					maxCount = cache[i][i + j];
			}
		}
	}
	printf("result = %d\n", maxCount+1);
	/*
	printf("--cache--\n");
	for (int i = 0;i < n;i++) {
		for (int j = 0;j < n;j++) {
			printf("%d ", cache[i][j]);
		}
		printf("\n");
	}
	*/
	
}

cache์™€ ๊ด€๋ จ๋œ for๋ฌธ์—์„œ

i๋ฅผ n-2๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š”, ๋งจ ๋งˆ์ง€๋ง‰์ค„์—๋Š” ์ฑ„์šธ ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

j๋ฅผ 2๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š”, j=1์ผ ๋•Œ (๋ฐ”๋กœ ๋‹ค์Œ์ˆซ์ž์™€ ๊ตฌํ•  ๋•Œ)๋ฅผ for๋ฌธ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— if๋ฌธ์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ •๋‹ต ํ’€์ด 

์ฑ…์— ๊ธฐ์žฌ๋œ ํ’€์ด๋Š”, ์žฌ๊ท€์™€ ์ผ์ฐจ์› cache๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. 

LIS์˜ ์‘์šฉ๋ฌธ์ œ์ธ JLIS๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ, ์žฌ๊ท€๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ–ˆ๋‹ค.

 

์šฐ์„ , ์ฝ”๋“œ๋Š” ์ด๋Ÿฌํ•˜๋‹ค. 

#include <stdio.h>
#include <algorithm>
using namespace std;

int n;
int cache[101], arr[100];

int lis_recursive(int start) {
	int& ret = cache[start + 1];
	if (ret != -1) return ret;
	ret = 1;
	for (int next = start + 1; next < n;next++)
		if (start == -1 || arr[start] < arr[next])
			ret = max(ret, lis_recursive(next) + 1);
	return ret;
}
int main() {
	fill(cache, cache + 101, -1);
	scanf_s("%d", &n);
	for (int i = 0;i < n;i++)
		scanf_s("%d", &arr[i]);
	
	printf("result = %d\n", lis_recursive(-1)-1);
}

cache[i]์—๋Š” i+1๋ฒˆ์งธ ์นธ~๋ ์นธ๊นŒ์ง€์˜ ์ตœ๋Œ€ LIS๊ธธ์ด๋ฅผ ์ €์žฅํ•œ๋‹ค.

ํŠน์ดํ•œ ์ ์€, main์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ start๋ฅผ 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, -1๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ ์ด๋‹ค. 

์ฃผ์–ด์ง„ ์ˆ˜์—ด์˜ -1๋ฒˆ ์นธ์„ -๋ฌดํ•œ๋Œ€๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ’€์ดํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. (๋ชจ๋“  ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ž๋™์œผ๋กœ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉ) 

๊ทธ๋ž˜์„œ return ๋œ ret๊ฐ’์— -1๋ฒˆ์นธ ๊นŒ์ง€ ์„ธ์–ด์ง„ ๊ฒƒ์ด๋ฏ€๋กœ 1์„ ๋นผ์ค˜์•ผ ์ตœ์ข… LIS์˜ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค. 

 

 

๋ฐ˜์‘ํ˜•