๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””/Java

[๋ฐฑ์ค€][ํ”Œ๋ž˜ํ‹ฐ๋„˜ 5][LIS] 14003. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 5

iknowDev 2022. 12. 13. 00:32
๐Ÿ’ก 	์ด๋ถ„ ํƒ์ƒ‰ O(logN)
	๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS) O(n log n)

[๋ฌธ์ œ]

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

 

[์ž…๋ ฅ]

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

 

[์ถœ๋ ฅ]

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ •๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

[ํ’€์ด]

๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ์ด์ง€๋งŒ ์กฐ๊ฑด๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ์ธ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 4๋Š” DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” N์˜ ๋ฒ”์œ„๊ฐ€ ํฌ๊ธฐ์— DP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. LIS ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ €์žฅ ์œ„์น˜์— ๋ฐฐ์—ด ์ €์žฅ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.

    1. ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€ํ•˜๋Š” lenList ๋ฐฐ์—ด

    2. ์ด๋ถ„ ํƒ์ƒ‰ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํ˜„์žฌ ๊ฐ’(v)์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ(insertPos)๋ฅผ ์ฐพ๋Š”๋‹ค.

    3. ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด ๊ธธ์ด๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค ์ €์žฅ ๋ฐฐ์—ด(idxList)์— insertPos๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

    4. ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด ์ถœ๋ ฅ์„ ์œ„ํ•ด ๋’ค๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ฐ์†Œํ•˜๋Š” size์— ๋งž๋Š” idxList[i๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ฐœ๊ฒฌ)
idxList[i] = Integer.MAX_VALUE; ๋ถ€๋ถ„์„ ์ถ”์„์ฒ˜๋ฆฌ ํ•ด๋„ AC๋ฅผ ๋ฐ›๋Š” ๋ฌธ์ œ
์ž…๋ ฅ ๋ฒ”์œ„๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ์ธ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2 ์—๋Š” ์ œ์ถœํ•˜๋ฉด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๋ฅผ ๋ฐ›์ง€๋งŒ
ํ•ด๋‹น ๋ฌธ์ œ์—๋Š” ์•„๋ž˜์˜ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๊ฐ€ ์—†๋Š” ๋ชจ์–‘์ด๋‹ค.

Input:
4
1 3 3 2

Answer:
2
1 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int size = 0;
		StringTokenizer st = new StringTokenizer(br.readLine());
		int[] inputList = new int[N];
		int[] idxList = new int[N];
		int[] lenList = new int[N];
		
		for (int i = 0; i < N; i++) {
			int v = Integer.parseInt(st.nextToken());
			inputList[i] = v;
			
			int pos = Arrays.binarySearch(lenList, 0, size, v);
			if(pos >= 0) {
				idxList[i] = Integer.MAX_VALUE; // ์ฃผ์„์ฒ˜๋ฆฌ ํ•ด๋„ ํ†ต๊ณผ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ์  ๋ฐœ๊ฒฌ
				continue;
			}
			
			int insertPos = Math.abs(pos) - 1;
			lenList[insertPos] = v;
			idxList[i] = insertPos;
			
			if(insertPos == size) size++;
		}

		int len = size;
		StringBuilder sb = new StringBuilder();
		sb.append(size + "\n");
		
		for (int i = N-1; i >= 0; i--) {
			if(idxList[i] == size-1) {
				lenList[--size] = inputList[i];
				if(size == 0) break;
			}
		}
		
		for (int i = 0; i < len; i++) sb.append(lenList[i] + " ");
		System.out.print(sb);
	}
}

 

 

[๊ฒฐ๊ณผ]


๋ฐฑ์ค€(BOJ) ๋ฌธ์ œ ์ค‘ [ 14003. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 5 ] ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.