λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”Ž Algorithm/πŸ’» 문제 풀이

[λ°±μ€€] 9251. LCS

by Seongpyo Hong 2021. 2. 10.

문제

 

풀이

ν•˜λ£¨μ’…μΌ 이 문제만 λΆ™λ“€κ³  μžˆμ—ˆλ˜ 것 κ°™λ‹€. 처음 μ‹œλ„ν–ˆλ˜ 방법은 일차원 배열을 톡해 λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μˆ˜ν–‰ν•˜κ³ μž ν–ˆλ‹€. ν•˜μ§€λ§Œ 일차원 배열을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 같은 λ¬Έμžκ°€ μ—¬λŸ¬λ²ˆ λ“±μž₯ν•  κ²½μš°μ— λŒ€ν•΄μ„œ 잘λͺ»λœ μ΅œλŒ€κ°’μ„ μ–»λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	static int[][] cache;

	public static void main(String[] args) throws IOException {
		String s1 = br.readLine();
		String s2 = br.readLine();
		boolean isS1 = (s1.length() < s2.length()) ? true : false;
		int len = (s1.length() < s2.length()) ? s1.length() : s2.length();
		cache = new int[len + 1][2];

		if (isS1) {
			System.out.println(getLCS(s1, s2, len));
		} else {
			System.out.println(getLCS(s2, s1, len));
		}
	}

	static int getLCS(String smaller, String longer, int len) {
		cache[len][0] = 0;
		cache[len][1] = len-1;
		for (int i = len - 1; i >= 0; i--) {
			char target = smaller.charAt(i);
			int maxCnt = 0;
			int maxIdx = -1;
			for (int j = i + 1; j <= len; j++) {
				int idx = longer.substring(0, cache[j][1] + 1).lastIndexOf(target);
				if (idx < 0)
					continue;
				if (maxCnt < cache[j][0] + 1) {
					maxCnt = cache[j][0] + 1;
					maxIdx = idx;
				} else if (maxCnt == cache[j][0] + 1) {
					maxIdx = (maxIdx < idx) ? idx : maxIdx;
				}
			}
			cache[i][0] = maxCnt;
			cache[i][1] = maxIdx;
		}
		
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < len; i++) {
			if (max < cache[i][0])
				max = cache[i][0];
		}
		return max;
	}
}

κ·Έλž˜μ„œ λͺ¨λ“  경우의 수λ₯Ό μ•Œ 수 있기 μœ„ν•΄μ„œ 이차원 배열을 톡해 λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μƒκ°ν–ˆλ‹€. μ΄μ°¨μ›μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 경우, 각 μžλ¦¬κΉŒμ§€μ˜ μ΅œλŒ€ LCSλ₯Ό μœ μ§€ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μˆ˜ν–‰ν•΄μ•Όν•œλ‹€. μ’€ 더 μžμ„Ένžˆ 보면 λ§Œμ•½ ν•΄λ‹Ή μžλ¦¬μ™€ 같은 문자인 κ²½μš°μ—λŠ” μ΄μ „μ˜ κ·Έ μžλ¦¬κΉŒμ§€ μ „μ˜ μ΅œλŒ€κ°’ + 1이 되고 λ§Œμ•½ 같지 μ•Šλ‹€λ©΄ 이전 문자의 μ΅œλŒ€κ°’(이전 ν–‰)κ³Ό 이번 문자λ₯Ό λΉ„κ΅ν•˜λ©΄μ„œ 생긴 μ΅œλŒ€κ°’(이전 μ—΄) μ€‘μ—μ„œ μ΅œλŒ€κ°’μ΄ λœλ‹€.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution9251 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	static int[][] cache;

	public static void main(String[] args) throws IOException {
		String row = br.readLine();
		String col = br.readLine();
		cache = new int [row.length() + 1][col.length() + 1];

		for (int i = 1; i < row.length() + 1; i++) {
			for (int j = 1; j < col.length() + 1; j++) {
				if (row.charAt(i - 1) == col.charAt(j - 1)) {
					cache[i][j] = cache[i-1][j-1] + 1;
				} else {
					cache[i][j] = Integer.max(cache[i-1][j], cache[i][j-1]);
				}
			}
		}
		System.out.println(cache[row.length()][col.length()]);
	}
}

λŒ“κΈ€