- ์๊ณ ๋ฆฌ์ฆ
- ์นด์นด์ค ์ฝํ
- ์ฌ๊ท
- ์น๋ฆฐ์ด
- ๋นํธ๋งต
- ๋ฐฑ์ค
- go
- ํ๋ก๊ทธ๋๋จธ์ค
- golang
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ค์ต์คํธ๋ผ
- ์์ฝ๋
- ์ํฐ๋
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ํธ๋ฆฌ
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ๋นํธ๋ง์คํน
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- C++
- DFS
- LCs
- DP
- nestjs
- BFS
- ์ด๋ถํ์
- js
- Union-Find
- ์นด์นด์ค2021
- Python
- Today
- Total
Hello Ocean! ๐ผ
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๊ณ ์คํ #PI ๋ณธ๋ฌธ
๋ฌธ์
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต 8๋จ์ ๋ฌธ์ . ์์ฃผ์จ ์ธ์ฐ๊ธฐ
https://www.algospot.com/judge/problem/read/PI
์ ๋ ฅ๋ ์์ด์, 3-5์๋ฆฌ์ฉ ๋์ด์ ๋์ด๋๋ฅผ ํ๊ฐํ๋ค.
๋์ด๋๋ฅผ ํ๊ฐํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ชจ๋ ์ซ์๊ฐ ๊ฐ์ ๋ (์: 333, 5555) ๋์ด๋: 1
- ์ซ์๊ฐ 1์ฉ ๋จ์กฐ ์ฆ๊ฐํ๊ฑฐ๋ ๋จ์กฐ ๊ฐ์ํ ๋ (์: 23456, 3210) ๋์ด๋: 2
- ๋ ๊ฐ์ ์ซ์๊ฐ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ถํํ ๋ (์: 323, 54545) ๋์ด๋: 4
- ์ซ์๊ฐ ๋ฑ์ฐจ ์์ด์ ์ด๋ฃฐ ๋ (์: 147, 8642) ๋์ด๋: 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์ ์ด์ฉํด์ ์ ๋ ฅ ๋ฐ์๋ค.
์ ์ถ ๊ฒฐ๊ณผ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
go ์ธ์ด ์์ํ๊ธฐ (0) | 2020.07.07 |
---|---|
[์๊ณ ์คํ] ์์ํ #Quantize, ์ฑ 8.9์ (0) | 2020.05.11 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #1461 ๋์๊ด (1) | 2020.04.23 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #9251 LCS (0) | 2020.04.19 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋]์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ์ ๋ต LIS (0) | 2020.04.13 |