[백준] 3568번 iSharp Java 문제 풀이

2022. 1. 27. 12:15카테고리 없음

728x90
반응형

문제

선영이는 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글자를 넘지 않는다.

출력

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


예제 입력 1

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

예제 출력 1

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


문제풀이

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

interface Main{
    static void main(String[]a) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        String str = br.readLine(), result = "";
        String regex = "([\\w]+)([&*\\[\\]]+)?";      
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()) {
          result = matcher.group();
        }
        while(matcher.find()) {
          bw.write(result);
          if(matcher.group(2) != null) {
            sb.setLength(0);
            bw.write(sb.append(matcher.group(2)).reverse().toString().replaceAll("\\]\\[", "\\[\\]"));
          }         
          bw.write(" " + matcher.group(1) + ";\n");
        }
        
        bw.flush(); 
    }
}

기본 변수형은 계속 써야 하기 때문에 처음에 matcher.find()를 해준 다음에 matcher.group()의 값으로 초기화 시킵니다.

 

그다음부터는 입력된 값에서 특수문자들을 역순으로 출력해야 되는데

정규식을 써서 첫 번째 그룹은 일반 알파벳을 그룹핑하고 두 번째 그룹은 특수문자들을 그룹핑 했습니다.

 

matcher.group(2)를 하면 두 번째 그룹의 값이 나오는데 이 값이 있다면 StringBuilder의 값을 초기화 시키고 역순으로 바꾼 다음 대괄호의 위치를 다시 바꿔주도록 했습니다.

 

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

 

3568번: iSharp

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

www.acmicpc.net

 

728x90
반응형