[BOJ 3568] iSharp
#문제
https://www.acmicpc.net/problem/3568
#풀이
해당 문제는 단순히 나와있는대로 그대로~ 하는것이 중요합니다.
저는 너무 생각을 많이해서 저어어 멀리까지 갔다 다시 돌아왔습니다.
변수형에서 나오는 배열,참조,포인터 순서대로 알고 있어야되며, 변수명 뒤에 나오는 추가 변수형또한 앞에 변수형의 순서에 맞게 차곡차곡 알아서 쌓이게 만드는줄 알았습니다.
예를 들면 int&[]*[]& aADD*[]&; 식의 문장이 있을때는
int&&&[][][]** aADD; 로 바뀌는 줄 알았던 것이죠....:(
정말로 이해력에 감탄했습니다..ㅎㅎ..
다시 문제에대해 말하자면, 먼저 빈칸을 기준으로 나누어야 합니다.
제가 주로 쓰는 방식은 sstream을 이용하여 문자들을 나눕니다.
또한 한 줄에 대하여만 입력을 받기때문에 getline을 사용하시는것이 편할 것이라 생각됩니다.
sstream 사용법은 구글링으로 쉽게 찾을 수 있습니다. :)
공통된 변수형을 뽑아내었다면, 변수명과 추가 변수형을 분리 시켜주어야합니다.
이때 문제에서 친절히 "변수의 오른편에 있는 변수형은 순서를 뒤집어서 왼편에 붙일 수 있다." 라고 나와있습니다.
이걸 놓치다니....따흑..
따라서 변수명의 맨 뒤에서부터 시작해주면됩니다.
끝에 , 와 ; 는 무시 해주면 되므로 총 길이에서 -2한 값부터 시작을 해줍니다.(왜? 거꾸로 뒤집기 위해 뒤에서부터 시작!)
여기서 조심!
뒤에서 부터 시작했으니 변수명도 그대로 출력하면 뒤집어 지겠죠?
앞에다가 차곡차곡 붙혀 나중에 한번에 출력해주도록 합니다. :)
#코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> #include <sstream> using namespace std; int main(){ string str; getline(cin,str); stringstream ss(str); string type; ss >> type; string var; while(ss >> var){ string varName = ""; cout << type; for(int i = (int)var.size()-2; i >= 0; i--){ if(var[i] == '&' || var[i] == '*'){ cout << var[i]; }else if(var[i] == ']'){ cout << "[]"; i--; }else{ varName = var[i]+varName; } } cout << " " << varName << ";" << endl; } return 0; } | cs |