[C++] ALGOSPOT : URI


Image 6

Image 7

이 문제는 HEX -> DEC -> CHR 방식으로 변환을 해주어 풀 수 있다.

먼저, 주어진 문자열에 있는 Encoded String을 모두 추출하여 vector에 추가 해 두고

vector 안에 있는 값들을 변환하여 치환하는 방식으로 문제를 풀면 된다.

 

간단한 문제지만, 함정 하나 때문에 정답을 얻는데 좀 오래 걸렸다.

C++에는 일치하는 모든 문자열을 치환하는 함수가 없어서 직접 작성하였는데

이 부분이 오류였다. 모든 문자열이 아니라 한번만 치환해야 했던것 !

 

예를들어 abc%2525%2525abc 를 넣어주면

abc%25%25abc 이렇게 출력해야하는데

%25, %25 두개를 vector에 넣어두고 루프를 실행하면

 

첫번째 루프:  abc%25%25abc
두번째 루프: abc%%abc 이런식으로 되서 오답처리 되었던 것.

 

알고리즘 문제 풀땐 질문을 잘 이해하는것이 매우 중요한것 같다.

 

날 함정에 빠뜨렸던 replace 함수는 주석처리되어있다.

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;

/* 문자열 치환 
void replace(string &str_text, string str1, string str2){
 int pos = 0;
 while((pos=str_text.find(str1, pos))!=string::npos){
 str_text.erase(pos, str1.length());
 str_text.insert(pos, str2);
 pos += str2.length();
 }
}
*/

int hex_to_dec(char c){
    /*
     * 48~57: 0~9
     * 65~90: A~Z
     * 97~122: a~z
     */
    int dec = 0;
    if(c<58)
        dec = c - '0';
    else if(c<90)
        dec = c - 55;
    else if(c<122)
        dec = c - 87;
    else
        return -1;

    return dec;
}
char hex_to_char(string hex){
    return hex_to_dec(hex.at(0)) * 16 + hex_to_dec(hex.at(1));
}

class URI{
    public:
        URI(void);
        URI(string uri);
        string uri;
        string decode();
};

URI::URI(){
    uri = "";
}

URI::URI(string uri){
    this->uri = uri;
}

string URI::decode(){
    vector<string> v;
    string decoded = uri;
    int pos=0;

    while((pos=uri.find("%", pos))!=string::npos){
        v.push_back(uri.substr(pos, 3));
        pos += 3;
    }

    pos=0;
    for(string s : v){
       // replace(decoded, s, string(1, hex_to_char(s.substr(1,2)))) ;
        pos=decoded.find(s,pos);
        decoded.erase(pos,3);
        decoded.insert(pos++, string(1, hex_to_char(s.substr(1,2))));

    }

    return decoded;
}

int main(){
    int t = 0;
    cin >> t;

    vector<URI> v;
    for(int i=0; i<t; i++){
        string input;
        cin >> input;
        URI uri(input);
        v.push_back(uri);
    }

    for(URI uri : v){
        cout << uri.decode() << endl;
    }   
}