본문 바로가기

알고리즘 문제풀이/추천 문제

[ 백준 3568 ] iSharp (C++)

반응형

https://www.acmicpc.net/problem/3568

 

3568번: iSharp

입력으로 주어진 변수 선언문을 문제의 조건에 맞게 변형한 뒤, 한 줄에 하나씩 출력한다. 변수형과 변수명 사이에는 공백이 하나 있어야 한다. 출력은 입력으로 주어진 변수 선언문에서 변수가

www.acmicpc.net

 

단순 구현 문제라 그냥 풀면 됐던 문제. 

 

우선 입력값을 분리하는 split 함수를 먼저 보자. 아래의 아이디어를 그대로 구현하면 된다. 

 

예제의 입력값  int&  a*[]&,  b,  c*;  을 분리하려면, 공백을 기준으로 분리한 다음 각 문자열을 벡터에 넣어주면 된다. 

 

나는 string의 'find' 함수를 써서 구현했다. 어렵지 않으니 아래 정답 코드를 보면 쉽게 이해할 수 있을 것이다. 

 

그 다음으로 변수명은 대문자 또는 소문자 알파벳만 가능하므로 어떤 문자가 대소문자 알파벳인지 판별해주는 boolean 함수를 만들어 줬다. 

 

이제 예제의 입력값으로 한번 풀어보자.

 

입력값  =  int&  a*[]&,  b,  c*; 

split 결과 벡터
vars = { int&, a*[]&, b, c* }

vars[0] 은 무조건 변수 타입이 된다. 이를 type이라는 변수에 저장해준다. 

1번째 인덱스부터 아래의 과정을 거치면 된다. 
빈 문자열 type_ 과 _var 
문자열의 끝부터 역순으로 다음을 검사 
1) 대소문자 알파벳이 아니면 type_ 에 더해준다. 단, '[]' 는 역순으로 더해줘야한다. 안그러면 '][' 형태로 출력함.
2) 대소문자 알파벳이면 _var 에 역순으로 더해준다

type , type_  , " " ,  _var  , ";"  순서로 출력해주면 된다.

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> split(string input, char token){
    vector<string> vars;
    int pre = 0;
    int cur = input.find(token);

    while (cur != string::npos) {
        vars.push_back(input.substr(pre, cur - pre));
        pre = cur + 1;
        cur = input.find(token, pre);
    }
    vars.push_back(input.substr(pre, cur - pre));
    // find는 인자가 없으면 마지막 인자 반환
    
    return vars;
}


bool is_alpha(char c){
    if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
        return true;
    return false;
}


int main() {
    vector<string> vars;
    string input;
    getline(cin, input);
    
    vars = split(input, ' ');

    string type, type_, _var, var;
    for (int i = 0; i < vars.size(); i++) {
        if (i == 0) {
            type = vars[i];
            continue; // 첫번째는 타입에 저장
        }
        else {
            // 가장 끝은 ; 또는 , 니깐 제거
            var = vars[i].substr(0, vars[i].size() - 1);
            type_ = "";
            _var = "";
            for (int i = var.size() - 1; i >= 0; i--) {
                if(is_alpha(var[i])){
                   // 알파벳이면 변수명이므로 빼준다
                    _var = var[i] + _var; // 역순으로 더해줘야함
                    continue;
                }
                if (var[i] == ']') type_ += '[';
                else if (var[i] == '[') type_ += ']';
                else type_ += var[i];
            }
            cout << type << type_ << " " << _var << ";" << endl;
        }
    }
    
    return 0;
}
반응형