[Algorithm] ๐Ÿฅง์›์ฃผ์œจ ์™ธ์šฐ๊ธฐ

HaJingJingยท2021๋…„ 4์›” 23์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
20/119

0. ๋ฌธ์ œ

๋ฌธ์ œ
(์ฃผ์˜: ์ด ๋ฌธ์ œ๋Š” TopCoder ์˜ ๋ฒˆ์—ญ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)


๊ฐ€๋” TV ์— ๋ณด๋ฉด ์›์ฃผ์œจ์„ ๋ช‡๋งŒ ์ž๋ฆฌ๊นŒ์ง€ ์ค„์ค„ ์™ธ์šฐ๋Š” ์‹ ๋™๋“ค์ด ๋“ฑ์žฅํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์ด ์ด ์ˆ˜๋ฅผ ์™ธ์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ์ˆซ์ž๋ฅผ ๋ช‡ ์ž๋ฆฌ ์ด์ƒ ๋Š์–ด ์™ธ์šฐ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ˆซ์ž๋ฅผ ์„ธ ์ž๋ฆฌ์—์„œ ๋‹ค์„ฏ ์ž๋ฆฌ๊นŒ์ง€๋กœ ๋Š์–ด์„œ ์™ธ์šฐ๋Š”๋ฐ, ๊ฐ€๋Šฅํ•˜๋ฉด 55555 ๋‚˜ 123 ๊ฐ™์ด ์™ธ์šฐ๊ธฐ ์‰ฌ์šด ์กฐ๊ฐ๋“ค์ด ๋งŽ์ด ๋“ฑ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.


์ด ๋•Œ, ๊ฐ ์กฐ๊ฐ๋“ค์˜ ๋‚œ์ด๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •ํ•ด์ง‘๋‹ˆ๋‹ค:


๋ชจ๋“  ์ˆซ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ (์˜ˆ: 333, 5555) ๋‚œ์ด๋„: 1
์ˆซ์ž๊ฐ€ 1์”ฉ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹จ์กฐ ๊ฐ์†Œํ•  ๋•Œ (์˜ˆ: 23456, 3210) ๋‚œ์ด๋„: 2
๋‘ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์ถœํ˜„ํ•  ๋•Œ (์˜ˆ: 323, 54545) ๋‚œ์ด๋„: 4
์ˆซ์ž๊ฐ€ ๋“ฑ์ฐจ ์ˆ˜์—ด์„ ์ด๋ฃฐ ๋•Œ (์˜ˆ: 147, 8642) ๋‚œ์ด๋„: 5
๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ ๋‚œ์ด๋„: 10
์›์ฃผ์œจ์˜ ์ผ๋ถ€๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋‚œ์ด๋„์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ์ˆซ์ž๋“ค์„ 3์ž๋ฆฌ์—์„œ 5์ž๋ฆฌ๊นŒ์ง€ ๋Š์–ด ์ฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ์˜ ๋‚œ์ด๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์ž…๋ ฅ
์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ C (<= 50) ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” 8๊ธ€์ž ์ด์ƒ 10000๊ธ€์ž ์ดํ•˜์˜ ์ˆซ์ž๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ถœ๋ ฅ
๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„์— ์ตœ์†Œ์˜ ๋‚œ์ด๋„๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

1. ์•„์ด๋””์–ด

L๊ธ€์ž ์ œ์™ธ ๋‚˜๋จธ์ง€ ์ˆ˜์—ด์— ๋Œ€ํ•œ ๋‚œ์ด๋„ + ๊ธธ์ด L์ธ ์กฐ๊ฐ์˜ ๋‚œ์ด๋„ (L์€ 3-5)
๋ฉ”๋ชจ์ด์ œ์ด์…˜

2. ํ•ต์‹ฌ ํ’€์ด

1) L๊ธ€์ž ์ œ์™ธ ๋‚˜๋จธ์ง€ ์ˆ˜์—ด์— ๋Œ€ํ•œ ๋‚œ์ด๋„ + ๊ธธ์ด L์ธ ์กฐ๊ฐ์˜ ๋‚œ์ด๋„ (L์€ 3-5)

ret = Math.min(ret, memorize(begin+L) + classify(begin, begin+L-1));

2) ๋ฉ”๋ชจ์ด์ œ์ด์…˜

int ret = cache[begin];
if(ret != -1) return ret;
...		
return ret;

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class DP_EX_6 {
	static String N;
	static int cache[];
	static int max = 12345678;
	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int tc = Integer.parseInt(br.readLine().trim());
		
		while(tc > 0) {
			N = br.readLine().trim();
			cache = new int[N.length()];
			
			Arrays.fill(cache, -1);
			
			bw.flush();
			bw.write(memorize(0)+"\n");
			tc--;
		}
		
		bw.close();
	}
	
	static int classify(int a, int b) {
		String M = N.substring(a, b+1);
		String s = "";
		
		for(int i=0; i<M.length(); i++)
			s += M.charAt(0);
		
		if(M.equals(s)) return 1;
		
		boolean progressive = true;
		for(int i=1; i<M.length(); i++) {		
			if(M.charAt(i)-M.charAt(i-1) != M.charAt(1)-M.charAt(0)) {
				progressive = false;
				break;
			}
		}
		

		if(progressive && Math.abs(M.charAt(1)-(int)M.charAt(0)) == 1)
			return 2;
		
		boolean alternative = true;
		for(int i=0; i<M.length(); i++) {
			if(M.charAt(i) != M.charAt(i%2)) {
				alternative = false;
				break;
			}
		}
		
		if(alternative) return 4;
		if(progressive) return 5;
		
		return 10;
		
	}
	
	static int memorize(int begin) {
		if(begin == N.length()) return 0;
		
		int ret = cache[begin];
		if(ret != -1) return ret;
		ret = max;
		
		for(int L=3; L<=5; L++) {
			if(begin+L <= N.length())
				ret = Math.min(ret, memorize(begin+L) + classify(begin, begin+L-1));
		}
		
		return ret;
	}
}

4. ๊ฒฐ๊ณผ

์‹œ๊ฐ„์ดˆ๊ณผ ๋‚ฌ๋Š”๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฑธ๋กœ ๋ด์„œ๋Š” ์ž˜ ์ง  ๊ฑฐ ๊ฐ™๋‹ค..

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€