본문 바로가기
Algorithm/Baekjoon

Baekjoon 3568 iSharp JAVA

by Hunveloper 2022. 5. 13.
728x90
 

3568번: iSharp

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

www.acmicpc.net

문제

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

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

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

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

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

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

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

입력

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

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

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

출력

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

풀이

자료형과 변수명 두개로 split연산을 해서 나누고 시작한다.

자료형은 기본형태로 붙어있기게 여기에 추가적으로 붙는 변수형을 추가해준다.

변수의 오른편에 있는 변수형이 왼편으로 올때는 순서가 바뀌기에 []은 방향성이 있기에 ][로 변환된다.

이를 방지하기 위해 [ 일때는 ] , ] 일때는 [로 바꾸어준다.

코드
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws Exception{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String in = br.readLine();
		String [] data = in.split(" ");
		for(int i=1;i<data.length;i++)
			getParam(data[0], data[i]);
		System.out.println(sb.toString());
	}
	public static void getParam(String type, String str) {
		String out="";
		StringBuilder sym=new StringBuilder();
		for(int i=0;i<str.length();i++) {
			char cur = str.charAt(i);
			if(cur=='*' || cur=='&')
				sym.append(cur);
			else if(cur=='[')
				sym.append(']');
			else if(cur==']')
				sym.append('[');
			else if(('A'<=cur && cur<='Z') ||('a'<=cur && cur<='z') )
				out+=str.charAt(i);
		}
		sb.append(type+sym.reverse()+" ").append(out+";\n");
	}
}

 

728x90
728x90

댓글