본문 바로가기

code/BOJ

백준 3568 iSharp

 

 

3568번: iSharp

문제 선영이는 C, C++, Java와는 다른 아주 세련된 언어를 만들었다. 선영이는 이 아름답고 예술적인 언어의 이름을 i#으로 정했다. i#은 기본 변수형과 배열([]), 참조(&), 포인터(*)를 제공한다. 배열, 참조, 포인터는 순서에 상관없이 혼합해서 사용할 수 있다. 즉, int의 참조의 참조의 배열의 포인터도 올바른 타입이다. int&&[]* i#은 여러 개의 변수를 한 줄에 정의할 수 있다. 공통된 변수형을 제일 먼저 쓰고, 그 다음에 각

www.acmicpc.net

아직 string 사용이 미숙한 것 같다. 선배님의 코드가 굉장히 세련됐다고 느꼈는데, 입력받은 문자열에 대해 strtok를 수행하고 문자열을 뒤집을 때도 stack의 특성을 활용했기 때문이다.

/* 57분 소요 */
/* 1. 변수명 뒤에 추가변수형이 있을 것이라고 가정했지만 그렇지 않을 수도 있으므로 있을 경우에만 처리하기 */
/* 2. "변수명 + 추가변수형" 뒤에 바로 공백이 오는 것이 아니라 ','도 있기 떄문에 인덱스 2개씩 건너 뛰어야 */
/* 3. 공백이 아니라 ',' 또는 ';'가 오기 때문에 종결조건을 공백이 아닌 두 문자로 변경해야 */

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

using namespace std;

string in, basic;
vector<string> name, add;
int namen;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	getline(cin, in);

	int i; for (i = 0; in[i] != ' '; ++i);
	basic = in.substr(0, i); ++i;

	for (; i < in.size(); i += 2) {		/* 2 */
		int j;
		for (j = 0; ('a' <= in[i + j] && in[i + j] <= 'z') || ('A' <= in[i + j] && in[i + j] <= 'Z'); ++j);
		name.push_back(in.substr(i, j));
		i += j;

		for (j = 0; in[i + j] != ',' && in[i + j] != ';'; ++j);		/* 1 */	/* 3 */
		string tmp;
		for (int k = j - 1; k >= 0; --k) {
			if (in[i + k] == ']') { tmp.append("[]"); --k; }
			else tmp.push_back(in[i + k]);
		}
		add.push_back(tmp);
		i += j;

		++namen;
	}

	for (int namei = 0; namei < name.size(); ++namei)
		cout << basic << add[namei] << ' ' << name[namei] << ";\n";

	return 0;
}

아래는 선배님의 코드를 따라 작성했다.

/* 1. it >= str.end() 이면 애초에 dereference가 불가능하기 때문에 <str.end() 조건을 먼저 검사한다. */

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

using namespace std;

string str;
vector<string> wds;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	getline(cin, str);

	string wd;
	for (auto ch : str) {
		switch (ch) {
		case ' ': case ',': case ';':
			if(wd.size() > 0) 
				wds.push_back(wd);
			wd = ""; break;
		default:
			wd += ch; break;
		}
	}

	for (int wdi = 1; wdi < wds.size(); wdi++) {
		cout << wds[0];
		for (auto rit = wds[wdi].rbegin(); !(('a' <= *rit && *rit <= 'z') || ('A' <= *rit && *rit <= 'Z')); ++rit) {
			switch (*rit) {
			case ']': cout << "[]"; ++rit; break;
			default: cout << *rit; break;
			}
		}
		cout << ' ';
		/* 1 */
		for (auto it = wds[wdi].begin(); it < wds[wdi].end() && (('a' <= *it && *it <= 'z') || ('A' <= *it && *it <= 'Z')); ++it) {
			cout << *it;
		}
		cout << ";\n";
	}

	return 0;
}