[11053๋ฒˆ] ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด JAVAโ˜•

2022. 5. 8. 01:05ยท๐Ÿ”ฐ ๋ฐฑ์ค€/๋™์ ๊ณ„ํš๋ฒ• 1
728x90

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

 

11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด

www.acmicpc.net

์•Œ๊ณ ๋ฆฌ์ฆ˜ [์ ‘๊ทผ ๋ฐฉ๋ฒ•]

๋ณดํ†ต ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS)๋ผ๊ณ  ํ•œ๋‹ค. ๋ง ๊ทธ๋ž˜๋„ ์ฃผ์–ด์ง„ ์ˆ˜์—ด์—์„œ ์˜ค๋ฆ„์ฐจ ์ˆœ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์›์†Œ๋“ค์„ ์„ ํƒํ•˜์—ฌ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ์ž˜ ํ™œ์šฉํ•˜๋ฉด O(N log N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

์˜ˆ์ œ๋ฅผ ๋ณด์ž๋ฉด ์œ„ ์ˆ˜์—ด์€ {10, 20, 10, 30, 20, 50} ์ด๋‹ค. ์ด๋ฅผ seq๋ผ๊ณ  ํ•˜๊ณ , DP[]๋ฐฐ์—ด์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•œ๋‹ค.

๋จผ์ € seq[0] = 10์— ๋Œ€ํ•œ ์ˆ˜์—ด์„ ์ฐพ์•„๋ณด์ž๋ฉด seq[0]๋ณด๋‹ค ์ด์ „ ๊ฐ’์€ ์—†์œผ๋ฏ€๋กœ 10 ์ž์ฒด ํ•˜๋‚˜๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ DP[0] = 1์ด๋œ๋‹ค. ๊ทธ ๋‹ค์Œ seq[1] = 20์— ๋Œ€ํ•œ ์ˆ˜์—ด์„ ์ฐพ์•„๋ณด๋ฉด seq[0] = 10์œผ๋กœ 20๋ณด๋‹ค ์ž‘๊ธฐ ๋–„๋ฌธ์— {10,20}์ด๋ผ๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๊ณ , ๊ธธ์ด๋Š” 2๋กœ DP[1] = 2๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. seq[2] = 10์˜ ๊ฒฝ์šฐ ์ด์ „ ๊ฐ’๋“ค ์ค‘ ์ž‘์€๊ฒŒ ์—†์œผ๋ฏ€๋กœ {10} ํ•˜๋‚˜๋งŒ ๋˜๋ฏ€๋กœ DP[2] = 1์ด๋˜๊ณ  ์ด๋Ÿฐ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ๊ฐ dp[] ์˜ ๊ธธ์ด๋“ค์€ ๋‹ค์Œ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

dp[0] = {10} : ๊ธธ์ด 1

dp[1] = {10, 20} : ๊ธธ์ด 2

dp[2] = {10} : ๊ธธ์ด 1

dp[3] = {10, 20, 30} : ๊ธธ์ด 3

dp[4] = {10, 20} : ๊ธธ์ด 2

dp[5] = {10, 20, 30, 50} : ๊ธธ์ด 4

 

๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ์ธ๋ฑ์Šค(์œ„์น˜)์— ๋Œ€ํ•ด์„œ ์ด์ „ ์œ„์น˜๋“ค์„ ์ฐพ์•„๋‚˜๊ฐ€๋ฉด์„œ ํ•ด๋‹น๊ฐ’๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•ด ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.
static int LIS(int N) {
		
	// ๋งŒ์•ฝ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋˜ ์œ„์น˜์˜ ๊ฒฝ์šฐ 
	if(dp[N] == null) {
		dp[N] = 1;	// 1๋กœ ์ดˆ๊ธฐํ™” 
			
		// N ์ด์ „์˜ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ 
		for(int i = N - 1; i >= 0; i--) {
			// ์ด์ „์˜ ๋…ธ๋“œ ์ค‘ seq[N]์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฑธ ๋ฐœ๊ฒฌํ–ˆ์„ ๊ฒฝ์šฐ
			if(seq[i] < seq[N]) {
				dp[N] = Math.max(dp[N], LIS(i) + 1);
			}
		}
	}
	return dp[N];
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด์ž๋ฉด,

 

๋จผ์ € n๋ฒˆ์งธ ๊ฐ’์— ๋Œ€ํ•ด ์ด์ „์— ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

๋งŒ์•ฝ ์—†๋‹ค๋ฉด ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ DP[N]์„ 1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” '์ตœ์†Œํ•œ 1์ด์ƒ'์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค, N-1 ๋ถ€ํ„ฐ 0๊นŒ์ง€ N๋ณด๋‹ค ์ž‘์€ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ’์ด N๋ฒˆ์งธ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ์œ„ ์˜ˆ์‹œ๋Œ€๋กœ๋ผ๋ฉด N=4์„ ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•  ๋•Œ, 3~0๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ž‘์€ ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” seq[2] = 10 ๊ณผ seq[0] = 10 ๋ฐ–์— ์—†๋‹ค. ์ฆ‰, ๋ฐ˜๋ณต๋ฌธ i๋Š” 2์—์„œ ํ•œ๋ฒˆ ์žฌ๊ท€ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๊ณ , 0์—์„œ ์žฌ๊ท€ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

i=2์—์„œ ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’ DP[4]์™€ LIS(2) + 1 ์žฌ๊ท€ํ˜ธ์ถœํ•œ ๊ฐ’ ์ค‘ ํฐ ๊ฐ’์„ DP[4]์— ๊ฐฑ์‹ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹น์—ฐํžˆ +1์„ ํ•˜๋Š” ์ด์œ ๋Š” DP[N]์ด ์ด์ „ ๋ถ€๋ถ„์— N๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

LIS(2) ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ•˜๋ฉด DP[2]์€ ์•„์ง ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ DP[2] = 1๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ๋˜ํ•œ 0~1๊นŒ์ง€ ์ค‘ ์ž‘์€ ๊ฐ’๋“ค์„ ์ฐพ์•„๋‚ธ๋‹ค. ์ด ๋•Œ ์ด ๋ถ€๋ถ„์—์„œ seq[2] = 10๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ ์—†์œผ๋ฏ€๋กœ DP[N] = 1์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

๋‹ค์‹œ ๋Œ์•„์™€ DP[4]์™€ LIS(2) + 1์ค‘, ํฐ ๊ฐ’์€ LIS(2) + 1 (= ๋ถ€๋ถ„์ˆ˜์—ด {10, 20}), ์ฆ‰ 2์ด๊ธฐ ๋•Œ๋ฌธ์— DP[4]๋Š” 2๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋งˆ์ € ํƒ์ƒ‰ํ•˜๋ฉด i=0์ผ ๋•Œ seq[0] < seq[4]๋ฅผ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ์žฌ๊ท€ํƒ์ƒ‰์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ LIS(0) ๋˜ํ•œ 1์ด๋ฏ€๋กœ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 2๊ฐ€ ๋œ๋‹ค.


for(int i = 0; i < N; i++) {
	dp[i] = 1;
    
	// 0 ~ i ์ด์ „ ์›์†Œ๋“ค ํƒ์ƒ‰
	for(int j = 0; j < i; j++) {
    
		// j๋ฒˆ์งธ ์›์†Œ๊ฐ€ i๋ฒˆ์งธ ์›์†Œ๋ณด๋‹ค ์ž‘์œผ๋ฉด์„œ i๋ฒˆ์งธ dp๊ฐ€ j๋ฒˆ์งธ dp+1 ๊ฐ’๋ณด๋‹ค ์ž‘์€๊ฒฝ์šฐ
		if(seq[j] < seq[i] && dp[i] < dp[j] + 1) {
			dp[i] = dp[j] + 1;	// j๋ฒˆ์งธ ์›์†Œ์˜ +1 ๊ฐ’์ด i๋ฒˆ์งธ dp๊ฐ€ ๋œ๋‹ค.
		}
	}
}

๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ์‹์€ ์ด์ค‘๋ฐ˜๋ณต๋ฌธ์œผ๋กœ 0 ~ N-1 ๊นŒ์ง€ ๊ฐ ์›์†Œ๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์„ ์นด์šดํŒ…ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.



ํ’€์ด ๋ฐ ์ฝ”๋“œ

- ๋ฐฉ๋ฒ• 1 : [Scanner + Top-Down]

import java.util.Scanner;
 
public class Main {
	
	static int[] seq;
	static Integer[] dp;
	
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		
		seq = new int[N];
		dp = new Integer[N];
		
		
		for(int i = 0; i < N; i++) {
			seq[i] = in.nextInt();
		}
		
		// 0 ~ N-1 ๊นŒ์ง€ ๋ชจ๋“  ๋ถ€๋ถ„์ˆ˜์—ด ํƒ์ƒ‰ 
		for(int i = 0; i < N; i++) {
			LIS(i);
		}
		
		int max = dp[0];
		// ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ 
		for(int i = 1; i < N; i++) {
			max = Math.max(max, dp[i]);
		}
		System.out.println(max);
	}
	
	
	static int LIS(int N) {
		
		// ๋งŒ์•ฝ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋˜ ์œ„์น˜์˜ ๊ฒฝ์šฐ 
		if(dp[N] == null) {
			dp[N] = 1;	// 1๋กœ ์ดˆ๊ธฐํ™” 
			
			// N-1 ๋ถ€ํ„ฐ 0๊นŒ์ง€์ค‘ N๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์„ ์ฐพ์œผ๋ฉด์„œ ์žฌ๊ท€ํ˜ธ์ถœ. 
			for(int i = N - 1; i >= 0; i--) {
				if(seq[i] < seq[N]) {
					dp[N] = Math.max(dp[N], LIS(i) + 1);
				}
			}
		}
		return dp[N];
	}
}
main ์—์„œ LIS() ์„ 0~ N-1 ๊นŒ์ง€ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ๋ฐ˜๋“œ์‹œ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๊ฐ๊ฐ์˜ ์›์†Œ์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ์ฆ๊ฐ€ ์ˆ˜์—ด์„ ๋ชจ๋‘ ๊ตฌํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

- ๋ฐฉ๋ฒ• 2 : [Scanner + Bottom-Up]

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		int[] seq = new int[N];
		int[] dp = new int[N];
		
		for(int i = 0; i < N; i++) {
			seq[i] = in.nextInt();
		}
		
		// dp
		for(int i = 0; i < N; i++) {
			dp[i] = 1;
		    
			// 0 ~ i ์ด์ „ ์›์†Œ๋“ค ํƒ์ƒ‰
			for(int j = 0; j < i; j++) {
		    
				// j๋ฒˆ์งธ ์›์†Œ๊ฐ€ i๋ฒˆ์งธ ์›์†Œ๋ณด๋‹ค ์ž‘์œผ๋ฉด์„œ i๋ฒˆ์งธ dp๊ฐ€ j๋ฒˆ์งธ dp+1 ๊ฐ’๋ณด๋‹ค ์ž‘์€๊ฒฝ์šฐ
				if(seq[j] < seq[i] && dp[i] < dp[j] + 1) {
					dp[i] = dp[j] + 1;	// j๋ฒˆ์งธ ์›์†Œ์˜ +1 ๊ฐ’์ด i๋ฒˆ์งธ dp๊ฐ€ ๋œ๋‹ค.
				}
			}
		}
		
		// ์ตœ๋Œ“๊ฐ’(์ตœ๋Œ€ ๊ธธ์ด) ํƒ์ƒ‰ 
		int max = -1;
		for(int i = 0; i < N; i++) {
			max = dp[i] > max ? dp[i] : max;
		}
		System.out.println(max);
		
	}
 
}

 

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ”ฐ ๋ฐฑ์ค€/๋™์ ๊ณ„ํš๋ฒ• 1' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [2565๋ฒˆ] ์ „๊นƒ์ค„ JAVAโ˜•
  • [11054๋ฒˆ] ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด JAVAโ˜•
  • [2156๋ฒˆ] ํฌ๋„์ฃผ ์‹œ์‹ JAVAโ˜•
  • [10844๋ฒˆ] ์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜ JAVAโ˜•
juno1105
juno1105
๊ณต๋ถ€ํ•˜๋Š” ๊ฒธ ํฌํด ๋ธ”๋กœ๊ทธ
  • juno1105
    @juno1105
    juno1105
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (89)
      • ๐Ÿ’ฌ ์ž์œ  (3)
      • ๐Ÿ“– ์–ดํ•™ ๊ณต๋ถ€ (0)
      • ๐Ÿ“” ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ (4)
      • ๐Ÿ›  ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๋ฒ• (1)
      • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (53)
        • ์Šคํƒ (4)
        • ํ (4)
        • ์ •๋ ฌ ๋ฐ ํƒ์ƒ‰ (17)
        • ๋ฆฌ์ŠคํŠธ (5)
        • ํ•ด์‹œ (1)
        • ํŠธ๋ฆฌ (8)
        • ํž™ (2)
        • ๊ทธ๋ž˜ํ”„ (12)
      • ๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ๐Ÿšฅ ๋…ผ๋ฆฌํšŒ๋กœ (8)
      • ๐Ÿ”ฐ ๋ฐฑ์ค€ (20)
        • ํ, ์Šคํƒ, ๋ฑ (0)
        • DFS ์™€ BFS (3)
        • ๊ทธ๋ฆฌ๋”” (0)
        • ๋™์ ๊ณ„ํš๋ฒ• 1 (16)
        • ๋™์ ๊ณ„ํš๋ฒ• 2 (0)
        • ์ตœ๋‹จ ๊ฒฝ๋กœ (0)
        • ํŠธ๋ฆฌ (0)
        • ๋ฐฑํŠธ๋ž˜ํ‚น (0)
        • ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (0)
        • ์ง‘ํ•ฉ๊ณผ ๋งต (1)
      • ๐ŸŒˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (0)
      • ๐Ÿ“ฑ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • โœจ์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ปค๋ฆฌํ˜๋Ÿผโœจ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์‹œ๊ฐ„๋ณต์žก๋„
    ์ •๋ ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ
    ํ† ์ต 920์ 
    ํ† ์ต
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์ตœ๋‹จ๊ฒฝ๋กœ
    ํ† ์ต 950์ 
    ํ† ์ต 900
    ๋น…์˜คํ‘œ๊ธฐ๋ฒ•
    ์ •๋ ฌ
    ํ† ์ต 900์ ๋Œ€
    ํ† ์ต 910์ 
    ์ •๋ ฌ ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰
    ํ† ์ต 900์ 
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
juno1105
[11053๋ฒˆ] ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด JAVAโ˜•
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”