Hello Ocean! ๐ŸŒผ

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””] ์•Œ๊ณ ์ŠคํŒŸ #PI ๋ณธ๋ฌธ

Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””] ์•Œ๊ณ ์ŠคํŒŸ #PI

bba_dda 2020. 4. 27. 15:31
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ•ด๊ฒฐ ์ „๋žต 8๋‹จ์› ๋ฌธ์ œ. ์›์ฃผ์œจ ์™ธ์šฐ๊ธฐ 

https://www.algospot.com/judge/problem/read/PI

 

algospot.com :: PI

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

www.algospot.com

์ž…๋ ฅ๋œ ์ˆ˜์—ด์€, 3-5์ž๋ฆฌ์”ฉ ๋Š์–ด์„œ ๋‚œ์ด๋„๋ฅผ ํ‰๊ฐ€ํ•œ๋‹ค. 

๋‚œ์ด๋„๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

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

์–ด๋– ํ•œ ์ˆ˜์—ด์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ๊ฐ€๋Šฅํ•œ ๋‚œ์ด๋„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 

์˜ˆ๋ฅผ๋“ค์–ด, 8์ž๋ฆฌ์˜ ์ˆ˜์—ด์€ 5-3, 4-4, 3-5์ž๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด ๋‚œ์ด๋„๋ฅผ ๊ณ„์‚ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋“ค ์ค‘์— ๊ฐ€์žฅ ๋‚ฎ์€ ๋‚œ์ด๋„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์˜ ๋‚œ์ด๋„๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ž…๋ ฅ

C (testcase ๊ฐœ์ˆ˜)

C์ค„์— ๊ฑธ์ณ 8-10000์ž๋ฆฌ์˜ ์ˆ˜์—ด์ด ์ž…๋ ฅ๋œ๋‹ค. 

 

์ถœ๋ ฅ

๊ฐ ์ˆ˜์—ด์˜ ์ตœ์†Œ ๋‚œ์ด๋„.

 

ํ’€์ด

 

DP์™€ ์žฌ๊ท€๋ฅผ ํ•จ๊ป˜ ์ด์šฉํ•˜์˜€๋‹ค. 

basecase

1) ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ 3-5 ์‚ฌ์ด์ผ ๋•Œ

2) cache[start]์˜ ๊ฐ’์ด ์กด์žฌํ•  ๋•Œ

 

์ฝ”๋“œ 

#include <stdio.h> 
#include <iostream> 
#include<cstring>
#include<string> 
#include <limits.h> 
#include <algorithm>
using namespace std;

char arr[10001];
int cache[10001];
int recursive(int start, int len) {
	int result;
	int& ret = cache[start];
	if (ret != 0) {
		return ret;
	}
	if (len >= 3 && len <= 5) { //๋๋ถ€๋ถ„ ์ผ ๋•Œ 
		char before, after;
		int dif[4];
		int score = 0;
		bool flag[4] = { 1,1,1,1 };
		before = arr[start];
		for (int i = 1;i < len;i++) {
			after = arr[start + i];
			if (before != after) //๋‹ค๋ฅธ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ๋‚œ์ด๋„ 1 ํƒˆ๋ฝ 
				flag[0] = 0;
			dif[i - 1] = before - after;
			if (dif[i - 1] != 1 && dif[i - 1] != -1) 
				flag[1] = 0;
			if (i >= 2) { 
				if (dif[i - 2] != dif[i - 1]) { // ๋“ฑ์ฐจ์ˆ˜์—ด x
					flag[1] = 0;
					flag[3] = 0;
				}
			}
			if (arr[start+(i % 2)] != after) //์ˆซ์ž ๋‘๊ฐœ๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ 
				flag[2] = 0;
			before = after;
		}
		for (int i = 0;i < 4;i++) {
			if (flag[i] == 1) {
				if (i == 0)
					score = 1;
				else if (i == 1) 
					score = 2;
				else if (i == 2)
					score = 4;
				else if (i == 3)
					score = 5;
				break;
			}
		}
		if (score == 0)
			score = 10;
		return score;
	}

	char before, after;
	int dif[4];
	int score[3] = { 0,0,0 };
	bool flag[4];
	before = arr[start];
	//์•ž๋ถ€ํ„ฐ 3,4,5 ๋‚œ์ด๋„ ๊ณ„์‚ฐํ•ด์•ผํ•จ 
	for (int k = 3;k <= 5;k++) {
		before = arr[start];
		bool flag[4] = { 1,1,1,1 };
		for (int i = 1;i < k;i++) {
			after = arr[start + i];
			if (before != after) //๋‹ค๋ฅธ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ๋‚œ์ด๋„ 1 ํƒˆ๋ฝ 
				flag[0] = 0;
			dif[i - 1] = before - after;
			if (dif[i - 1] != 1 && dif[i - 1] != -1) 
				flag[1] = 0;
			if (i >= 2) {
				if (dif[i - 2] != dif[i - 1]) { // ๋“ฑ์ฐจ์ˆ˜์—ด x
					flag[1] = 0;
					flag[3] = 0;
				}
			}
			if (arr[start+(i % 2)] != after) //์ˆซ์ž ๋‘๊ฐœ๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ x
				flag[2] = 0;
			before = after;
		}
		for (int i = 0;i < 4;i++) {
			if (flag[i] == 1) {
				if (i == 0)
					score[k-3] = 1;
				else if (i == 1)
					score[k-3] = 2;
				else if (i == 2)
					score[k-3] = 4;
				else if (i == 3)
					score[k-3] = 5;
				break;
			}
		}
		if (score[k-3] == 0)
			score[k-3] = 10;
	}
	result = INT_MAX;
	if (len >= 6)
		result = min(recursive(start + 3, len - 3)+score[0],result);
	if (len >= 7) 
		result = min(recursive(start + 4, len - 4) + score[1], result);
	if (len >= 8)
		result = min(recursive(start + 5, len - 5)+score[2],result);
	ret = result;
	return result;
}
int main() {
	int C,len;
	scanf_s("%d\n", &C);
	string s;
	for (int c = 0;c < C;c++) {
		getline(cin, s);
		len = s.size();
		fill(cache, cache + len, 0);
		strcpy_s(arr, s.c_str());
		int result = recursive(0, len);
		printf("%d\n", result);
	}
}

์ž…๋ ฅ ๋ฐ›๋Š”๊ฒƒ๋„ ๊ฝค ์–ด๋ ค์› ๋‹ค. 

๊ฐ testcase๋ณ„๋กœ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๋”ฐ๋กœ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, int๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ string์„ ์ด์šฉํ•ด์„œ ์ž…๋ ฅ ๋ฐ›์•˜๋‹ค. 

 

์ œ์ถœ ๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•