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*& a는 int a&*와 같다.
변수의 선언이 보기 복잡하고 혼란스럽기 때문에, 앞으로는 한 줄에 변수를 하나씩 선언하려고 한다.
i#의 변수 선언문이 주어진다. 이때, 각각의 변수의 오른편에 있는 변수형을 모두 왼쪽으로 옮기고, 한 줄에 하나씩 선언하는 프로그램을 작성하시오.
입력
첫째 줄에 i#의 변수 선언문이 주어진다. 이 선언문에는 변수가 여러개 포함되어 있을 수도 있다.
선언문의 가장 처음에는 기본 변수형이 주어진다. 그 다음에는 추가적인 변수형이 주어진다. 추가적인 변수형은 없을 수도 있다. 그 다음 공백 이후에는 변수 선언이 하나씩 주어진다. 변수 선언은 콤마와 공백으로 나누어져 있고, ;로 끝난다. 각 변수의 선언 처음에는 기본 변수명이 주어진다. 그 다음에는 추가적인 변수형이 주어진다. 추가적인 변수형은 없을 수도 있다.
기본 변수형과 변수명은 같지 않으며, 알파벳 소문자와 대문자로만 이루어져 있다. 각 줄의 길이는 120글자를 넘지 않는다.
출력
입력으로 주어진 변수 선언문을 문제의 조건에 맞게 변형한 뒤, 한 줄에 하나씩 출력한다. 변수형과 변수명 사이에는 공백이 하나 있어야 한다. 출력은 입력으로 주어진 변수 선언문에서 변수가 선언된 순서대로 출력한다.
풀이
오랜만에 구현문제를 푸니까 역시 구현이 맛있다. 반례찾는 재미도 있고
풀고나니 너무 구현(?)스럽게 풀었나 싶기도하다. 진짜 시키는 대로 했어요.
공백을 기준으로 문자열 나누고 맨 앞에는 공통문자이므로 따로 분리해둠.
클린코드를 위해 temp는 좋지 않지만 임시저장소의 용도로만 사용하면 오히려 좋은 코드가 될 수 있으므로 진짜 문자를 임시로 저장하는 목적을 가지므로 오랜만에 temp변수명도 사용했당.
변수명과 추가 변수 타입을 구분하기 위해 isalpha를 사용하여 두 개를 분리하였다. 그 후 추가 변수 타입은 뒤집어서 문자열로 만들고 이를 모두 순서대로 이어붙혔다.
근데 나머지는 괜찮았는데 배열은 뒤집으면 []이 ][이 되는 반례가 존재하여 replace를 사용하여 ][가 있으면 []로 대치시켰다.
import sys
input = sys.stdin.readline
variables = list(input().split())
answer = []
for i in range(1, len(variables)):
temp = variables[0]
variable_name = ''
variable_type = ''
for i in variables[i][:-1]:
if i.isalpha():
variable_name += i
else:
variable_type += i
variable_type = ''.join(list(reversed(variable_type)))
if '][' in variable_type:
variable_type = variable_type.replace('][','[]')
temp += variable_type + ' ' + variable_name + ';'
answer.append(temp)
for i in answer: print(i)
'Algorithm > Online judge' 카테고리의 다른 글
[프로그래머스] 2021 카카오 인턴십 > 숫자 문자열과 영단어 (0) | 2021.08.21 |
---|---|
[프로그래머스] 2021 Dev-Matching > 로또의 최고 순위와 최저 순위 (0) | 2021.08.21 |
[백준] 11058번 > 크리보드 (0) | 2021.06.15 |
[백준] 1743번 > 음식물 피하기 (0) | 2021.06.14 |
[백준] 1303번 > 전쟁 - 전투 (0) | 2021.06.13 |