[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: PI (์ •๋‹ต ์ฝ”๋“œ x)

PI

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

๋ฌธ์ œ

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

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

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

  1. ๋ชจ๋“  ์ˆซ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ (์˜ˆ: 333, 5555) ๋‚œ์ด๋„: 1
  2. ์ˆซ์ž๊ฐ€ 1์”ฉ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹จ์กฐ ๊ฐ์†Œํ•  ๋•Œ (์˜ˆ: 23456, 3210) ๋‚œ์ด๋„: 2
  3. ๋‘ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์ถœํ˜„ํ•  ๋•Œ (์˜ˆ: 323, 54545) ๋‚œ์ด๋„: 4
  4. ์ˆซ์ž๊ฐ€ ๋“ฑ์ฐจ ์ˆ˜์—ด์„ ์ด๋ฃฐ ๋•Œ (์˜ˆ: 147, 8642) ๋‚œ์ด๋„: 5
  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 ์ด๊ณณ์— ์žˆ๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ง„ํ–‰ํ•ด ๋ดค์„ ๋•Œ ๋ช‡๊ฐ€์ง€ ๋‹ต์— ์–ด๊ธ‹๋‚œ๋‹ค. ๋ฒ”์œ„๊ฐ€ ํฐ ๊ณณ์—์„œ๋งŒ ์–ด๊ธ‹๋‚˜์„œ ์ •ํ™•ํ•œ ์ด์œ ๋ฅผ ์ฐพ์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ, ์• ์ดˆ์— ์ฝ”๋”ฉ ์‹œ ์ž˜๋ชป๋œ ์Šต๊ด€์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ธ๋“ฏ ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๊ธฐ์žฌํ•œ๋‹ค.

  1. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์“ฐ์ž

  2. ์žฌ๊ท€๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ด๊ณ  ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ์•ˆ ๋‚  ์ •๋„๋ผ๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜์ž

    ํ˜„์žฌ BFS๊ฐ™์ด queue๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ด๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.

  3. index๋Š” ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒŒ ์ •๋ˆํ•˜์—ฌ ์“ฐ์ž.

  4. ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์ž.

๋‹ค์Œ์— ๊ผญ ๋‹ค์‹œ ํ’€์–ด๋ณผ ๊ฒƒ

 

๋‹ค๋ฅธ ๋‹ต

https://jaimemin.tistory.com/319

 

algospot PI

๋ฌธ์ œ ๋งํฌ์ž…๋‹ˆ๋‹ค: https://algospot.com/judge/problem/read/PI ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ฑ…์˜ ๋‚ด์šฉ๊ณผ ๊ฑฐ์˜ ๊ฐ™์ง€๋งŒ getRank ํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•  ๋•Œ์™€ INF ์žฌ์ •์˜ํ•  ๋•Œ๋ฅผ ์ œ์™ธ..

jaimemin.tistory.com

์ด๊ณณ์˜ ๋‹ต์„ ๋ณด๋ฉด ์ •์„์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•