본문으로 바로가기

[SIM] 3568번 iSharp

category Algorithm/BOJ 문제풀이 2019. 1. 17. 21:39
3568_iSharp

3568번 iSharp

 

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


 

문제

선영이는 C, C++, Java와는 다른 아주 세련된 언어를 만들었다. 선영이는 이 아름답고 예술적인 언어의 이름을 i#으로 정했다.

i#은 기본 변수형과 배열([]), 참조(&), 포인터(*)를 제공한다. 배열, 참조, 포인터는 순서에 상관없이 혼합해서 사용할 수 있다. 즉, int의 참조의 참조의 배열의 포인터도 올바른 타입이다. int&&[]*

i#은 여러 개의 변수를 한 줄에 정의할 수 있다. 공통된 변수형을 제일 먼저 쓰고, 그 다음에 각 변수의 이름과 추가적인 변수형을 쓰면 된다. 예를 들면 아래와 같다.

int& a*[]&, b, c*;

a의 타입은 int&&[]*, b는 int&, c는 int&*이 된다. 변수의 오른편에 있는 변수형은 순서를 뒤집어서 왼편에 붙일 수 있다. 따라서, int *& aint a&*와 같다.

변수의 선언이 보기 복잡하고 혼란스럽기 때문에, 앞으로는 한 줄에 변수를 하나씩 선언하려고 한다.

i#의 변수 선언문이 주어진다. 이때, 각각의 변수의 오른편에 있는 변수형을 모두 왼쪽으로 옮기고, 한 줄에 하나씩 선언하는 프로그램을 작성하시오.

 

입력

첫째 줄에 i#의 변수 선언문이 주어진다. 이 선언문에는 변수가 여러개 포함되어 있을 수도 있다.

선언문의 가장 처음에는 기본 변수형이 주어진다. 그 다음에는 추가적인 변수형이 주어진다. 추가적인 변수형은 없을 수도 있다. 그 다음 공백 이후에는 변수 선언이 하나씩 주어진다. 변수 선언은 콤마와 공백으로 나누어져 있고, ;로 끝난다. 각각의 변수의 선언의 첫 글자는 변수명이고, 그 다음에는 추가적인 변수형 선언이다.

기본 변수형과 변수명은 같지 않으며, 알파벳 소문자와 대문자로만 이루어져 있다. 각 줄의 길이는 120글자를 넘지 않는다.

 

출력

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

 

예제 입력

int& a*[]&, b, c*;

 

예제 출력

int&&[]* a;
int& b;
int&* c;

 

해결방법

문자열을 다루는 구현 문제이다

 

 

⭐️ 솔루션 ⭐️

하나의 변수는 크게 3가지로 나눌 수 있다

  • 기본 자료형
  • 추가 자료형
  • 변수명

 

전체적인 흐름은 아래와 같다

  1. 기본 자료형을 자른다 ( 문자열의 시작부터 처음 띄어쓰기 전까지 )
  2. 문자열에서 기본 자료형 부분을 삭제한다
  3. , 를 기준으로 변수를 나눈 뒤, 벡터에 저장한다
  4. 벡터를 반복문으로 방문하여 추가 자료형와 변수명을 나눈다
  5. 추가 자료형은 역으로 뒤집은 후, 배열의 경우에만 예외 처리를 해준다

 

 

[ TC ]

24
int& a*[]&, b, c*;
Double[][] Array[];
int a;
int& a;
int[] aba;
int* abacaba;
int abacabadabacaba*;
int abacabadabacabaeabacabadabacaba*;
int abacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacaba[];
int&*& a&, b&*, c*&&;
int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai;
int[][][] a[], b[][], c[][][];
int a[][]&*&*, b, c[]**[][]***&*&*, d[]&&[][];
dsafsd adsf[]&[]**&, dsaf&&&****, dsfa**&[]&&, rfsdgf**&&[]*, dasfs;
a b&[][]&[][]&[]*&***&[]&&[][][]&&*[], c[][]&&&&&&[]*&**[]&[]**[]**[][]*[], d*&[][][]&[][][]&&[][], e[]*[]*&&*;
a b[][][][][]&&&&*[]*[]***&&*[][][]&[][][]*[]*[]&[]&[][]&[]&*[]****&[]**[]*[][]*[]&&&*[]&*&[]&[]&[]*[]*[]*&&&*[]*&&*&[];
a b*&&[]*[][]&[][][]&[]*[]*[]*&&&*[]*&&*&*[]&[]*&&[]&[][]*[]&***[]&[]*[][]*[]&[]**[]*&[]&&&&*[]*&[]****&&[]&[]*[]&*[]*;
a d[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][];
a e[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][];
a f********************************************************************************************************************;
q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& a;
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz i;
i zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u;
#1
int&&[]* a;
int& b;
int&* c;

#2
Double[][][] Array;

#3
int a;

#4
int& a;

#5
int[] aba;

#6
int* abacaba;

#7
int* abacabadabacaba;

#8
int* abacabadabacabaeabacabadabacaba;

#9
int[] abacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacaba;

#10
int&*&& a;
int&*&*& b;
int&*&&&* c;

#11
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
int j;
int k;
int l;
int m;
int n;
int o;
int p;
int q;
int r;
int s;
int t;
int u;
int v;
int w;
int x;
int y;
int z;
int aa;
int ab;
int ac;
int ad;
int ae;
int af;
int ag;
int ah;
int ai;

#12
int[][][][] a;
int[][][][][] b;
int[][][][][][] c;

#13
int*&*&[][] a;
int b;
int*&*&***[][]**[] c;
int[][]&&[] d;

#14
dsafsd&**[]&[] adsf;
dsafsd****&&& dsaf;
dsafsd&&[]&** dsfa;
dsafsd*[]&&** rfsdgf;
dsafsd dasfs;

#15
a[]*&&[][][]&&[]&***&*[]&[][]&[][]& b;
a[]*[][]**[]**[]&[]**&*[]&&&&&&[][] c;
a[][]&&[][][]&[][][]&* d;
a*&&*[]*[] e;

#16
a[]&*&&*[]*&&&*[]*[]*[]&[]&[]&*&[]*&&&[]*[][]*[]**[]&****[]*&[]&[][]&[]&[]*[]*[][][]&[][][]*&&***[]*[]*&&&&[][][][][] b;

#17
a*[]*&[]*[]&[]&&****[]&*[]*&&&&[]&*[]**[]&[]*[][]*[]&[]***&[]*[][]&[]&&*[]&[]*&*&&*[]*&&&*[]*[]*[]&[][][]&[][]*[]&&* b;

#18
a[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] d;

#19
a[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] e;

#20
a******************************************************************************************************************** f;

#21
q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& a;

#22
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz i;

#23
i zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;

#24
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] a;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] b;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] c;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] d;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] e;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] f;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] g;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] h;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] i;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] j;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] k;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] l;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] m;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] n;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] o;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] p;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] q;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] r;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] s;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] t;
uadsfoisnhdfsdiufdsf**[]&&&*[]*&*[]*&*[]*[]&*[]**[][]*&[] u;

 

 

소스코드

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

string str;
string base,name,type;

int main(int argc, const char * argv[]) {
    // cin,cout 속도향상
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    // 변수 선언문 입력
    getline(cin, str);
    
    // 기본 변수형
    base = "";
    for(int i=0; i<str.size(); i++){
        if(str[i] == ' '){
            string tmp = "";
            for(int j=i+1; j<str.size(); j++){
                tmp += str[j];
            }
            str = tmp;
            break;
        }else{
            base += str[i];
        }
    }
    
    // 변수명과 변수형 나누기
    name = "";
    type = "";
    for(int i=0; i<str.size();){
        if(str[i] == ',' || str[i] == ';'){
            // 변수형 역순
            string r_type = "";
            for(int j=(int)type.size()-1; j>=0; j--){
                if(type[j] == '[')
                    r_type += ']';
                else if(type[j] == ']')
                    r_type += '[';
                else
                    r_type += type[j];
            }
            
            // 출력
            cout << base << r_type << " " << name << ";" << "\n";
            
            // 초기화
            name = "";
            type = "";
            
            // 종료 조건
            if(str[i] == ';')
                break;
            else
                i+=2;
        }else if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')){
            name += str[i];
            i++;
        }else{
            type += str[i];
            i++;
        }
    }
    
    return 0;
}

 

'Algorithm > BOJ 문제풀이' 카테고리의 다른 글

[BF] 1065번 한수  (0) 2019.01.17
[SIM] 2290번 LCD Test  (0) 2019.01.17
[DFS] 3019번 테트리스  (0) 2019.01.17
[DFS] 14500번 테트로미노  (0) 2019.01.16
[DFS] 12100번 2048 (Easy)  (0) 2019.01.16