PI
https://www.algospot.com/judge/problem/read/PI
๋ฌธ์
(์ฃผ์: ์ด ๋ฌธ์ ๋ TopCoder ์ ๋ฒ์ญ ๋ฌธ์ ์ ๋๋ค.)
๊ฐ๋ TV ์ ๋ณด๋ฉด ์์ฃผ์จ์ ๋ช๋ง ์๋ฆฌ๊น์ง ์ค์ค ์ธ์ฐ๋ ์ ๋๋ค์ด ๋ฑ์ฅํ๊ณค ํฉ๋๋ค. ์ด๋ค์ด ์ด ์๋ฅผ ์ธ์ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ์ซ์๋ฅผ ๋ช ์๋ฆฌ ์ด์ ๋์ด ์ธ์ฐ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด๋ค์ ์ซ์๋ฅผ ์ธ ์๋ฆฌ์์ ๋ค์ฏ ์๋ฆฌ๊น์ง๋ก ๋์ด์ ์ธ์ฐ๋๋ฐ, ๊ฐ๋ฅํ๋ฉด 55555 ๋ 123 ๊ฐ์ด ์ธ์ฐ๊ธฐ ์ฌ์ด ์กฐ๊ฐ๋ค์ด ๋ง์ด ๋ฑ์ฅํ๋ ๋ฐฉ๋ฒ์ ํํ๊ณค ํฉ๋๋ค.
์ด ๋, ๊ฐ ์กฐ๊ฐ๋ค์ ๋์ด๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ํด์ง๋๋ค:
- ๋ชจ๋ ์ซ์๊ฐ ๊ฐ์ ๋ (์: 333, 5555) ๋์ด๋: 1
- ์ซ์๊ฐ 1์ฉ ๋จ์กฐ ์ฆ๊ฐํ๊ฑฐ๋ ๋จ์กฐ ๊ฐ์ํ ๋ (์: 23456, 3210) ๋์ด๋: 2
- ๋ ๊ฐ์ ์ซ์๊ฐ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ถํํ ๋ (์: 323, 54545) ๋์ด๋: 4
- ์ซ์๊ฐ ๋ฑ์ฐจ ์์ด์ ์ด๋ฃฐ ๋ (์: 147, 8642) ๋์ด๋: 5
- ๊ทธ ์ธ์ ๊ฒฝ์ฐ ๋์ด๋: 10
์์ฃผ์จ์ ์ผ๋ถ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋, ๋์ด๋์ ํฉ์ ์ต์ํํ๋๋ก ์ซ์๋ค์ 3์๋ฆฌ์์ 5์๋ฆฌ๊น์ง ๋์ด ์ฝ๊ณ ์ถ์ต๋๋ค. ์ต์์ ๋์ด๋๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (<= 50) ๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ 8๊ธ์ ์ด์ 10000๊ธ์ ์ดํ์ ์ซ์๋ก ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ์ต์์ ๋์ด๋๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ
5
12341234
11111222
12122222
22222222
12673939
์์ ์ถ๋ ฅ
4
2
5
2
14
๋์ ๋ต
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#define NULL_INT -1e9
using namespace std;
map<int, int> calMap;
string s;
int a; int b; int c; int d;
int point[4] = { 1,2,4,5 };
vector<int> answer;
void calValue(int start, int value) {
int flag[4] = { 1,1,1,1 };
b = 1; c = NULL_INT; d = NULL_INT;
int tmp_flag[3] = { 1,1,1 };
int less = s.length() - start;
if (less < 3) {
return;
}
if (less <= 5) {
tmp_flag[0] = 0; tmp_flag[1] = 0; tmp_flag[2] = 0;
tmp_flag[less - 3] = 1;
}
else {
less = 5;
}
for (int i = start+1; i < start+less; i++) {
// ๊ฒฐ๊ณผ ์ธก์
//
if (flag[0]==1) {
if (s[i] != s[i - 1])
flag[0] = 0;
}
//
if (flag[1]==1) {
if (!(abs(s[i] - s[i - 1]) == 1 && (b == NULL_INT || b == s[i] - s[i - 1])))
flag[1] = 0;
else {
b = s[i] - s[i - 1];
}
}
//
if (flag[2] == 1) {
if (c == NULL_INT)
c = s[i - 1] - '0';
else if (c != s[i] - '0') {
flag[2] = 0;
}
else {
c = s[i-1] - '0';
}
}
//
if (flag[3] == 1) {
if (d == NULL_INT) {
d = s[i] - s[i - 1];
}
else if (d == s[i] - s[i - 1]) {
flag[3] = 1;
}
else {
d = s[i] - s[i - 1];
flag[3] = 0;
}
}
// ๊ฒฐ๊ณผ๋ฃ๊ธฐ
if (i == start + 2 && tmp_flag[0]) {
for (int i = 0; i < 4; i++) {
if (flag[i]) {
if (calMap.find(start + 3) == calMap.end() || calMap[start + 3] > value+point[i]) {
calMap[start + 3] = value+point[i];
tmp_flag[0] = 0;
}
break;
}
}
if (tmp_flag[0]) {
if (calMap.find(start + 3) == calMap.end() || calMap[start + 3] > value + 10) {
calMap[start + 3] = value + 10;
}
}
}
else if (i == start + 3 && tmp_flag[1]) {
for (int i = 0; i < 4; i++) {
if (flag[i]) {
if (calMap.find(start + 4) == calMap.end() || calMap[start + 4] > value + point[i]) {
calMap[start + 4] = value + point[i];
tmp_flag[1] = 0;
}
break;
}
}
if (tmp_flag[1]) {
if (calMap.find(start + 4) == calMap.end() || calMap[start + 4] > value + 10) {
calMap[start + 4] = value + 10;
}
}
}
else if (i == start + 4 && tmp_flag[2]) {
for (int i = 0; i < 4; i++) {
if (flag[i]) {
if (calMap.find(start + 5) == calMap.end()|| calMap[start + 5] > value + point[i]) {
calMap[start + 5] = value + point[i];
tmp_flag[2] = 0;
}
break;
}
}
if (tmp_flag[2]) {
if (calMap.find(start + 5) == calMap.end() || calMap[start + 5] > value + 10) {
calMap[start + 5] = value + 10;
}
}
}
}
}
int main() {
int C;
cin >> C;
cin.ignore(256, '\n');
while (C--) {
getline(cin, s);
if (s[s.length()-1] == ' '){
s.erase(s.begin() + s.length() - 1);
}
calValue(0,0);
vector<int> ans;
while (calMap.size()) {
int size = calMap.size();
map<int, int>::iterator iter;
for (int i = 0; i<size; i++) {
iter = calMap.begin();
if (iter->first == s.length()) {
ans.push_back(iter->second);
}
else {
calValue(iter->first, iter->second);
}
calMap.erase(iter);
}
}
sort(ans.begin(), ans.end());
answer.push_back(ans.back());
}
for (int i = 0; i < answer.size(); i++) {
cout << answer[i] << endl;
}
}
์์ ๋ต์ https://pastebin.com/rhMYwAN3 ์ด๊ณณ์ ์๋ ํ ์คํธ์ผ์ด์ค๋ฅผ ์งํํด ๋ดค์ ๋ ๋ช๊ฐ์ง ๋ต์ ์ด๊ธ๋๋ค. ๋ฒ์๊ฐ ํฐ ๊ณณ์์๋ง ์ด๊ธ๋์ ์ ํํ ์ด์ ๋ฅผ ์ฐพ์ง๋ ๋ชปํ์ง๋ง, ์ ์ด์ ์ฝ๋ฉ ์ ์๋ชป๋ ์ต๊ด์ ์ ์งํ๋ ๊ฒ์ด ๋ฌธ์ ์ธ๋ฏ ํ์ฌ ์ฌ๊ธฐ์ ๊ธฐ์ฌํ๋ค.
-
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฃผ์๋ฅผ ๋ฐ์์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฐ์
-
์ฌ๊ท๋ก ๋๋ฆด ์ ์๋ ๊ตฌ์กฐ์ด๊ณ ์คํ์ค๋ฒํ๋ก์ฐ๊ฐ ์ ๋ ์ ๋๋ผ๋ฉด ์ฌ๊ทํจ์๋ก ๊ตฌํํ์
ํ์ฌ BFS๊ฐ์ด queue๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋๋ฐ, ์ด๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
-
index๋ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ ๋ํ์ฌ ์ฐ์.
-
์ต๋ํ ๊ฐ๋จํ๊ฒ ๊ตฌํํ์.
๋ค์์ ๊ผญ ๋ค์ ํ์ด๋ณผ ๊ฒ
๋ค๋ฅธ ๋ต
https://jaimemin.tistory.com/319
์ด๊ณณ์ ๋ต์ ๋ณด๋ฉด ์ ์์ธ ๊ฒ ๊ฐ๋ค.
Comment