Algorithm 문제/μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν•΄κ²°μ „λž΅

[c++] μ•Œκ³ λ¦¬μ¦˜ 문제 ν•΄κ²° μ „λž΅ 1ꢌ :: PI (μ •λ‹΅ μ½”λ“œ x)

희은w 2020. 4. 26. 10:19

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

이곳의 닡을 보면 정석인 것 κ°™λ‹€.

λ°˜μ‘ν˜•