문제 출처 : https://www.acmicpc.net/problem/3568
언어 : Kotlin
문제 설명 :
선영이는 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초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
int& a*[]&, b, c*; | int&&[]* a; int& b; int&* c; |
풀이 :
input 값에서 ,와 ;를 제거후 " "으로 split.
해당 리스트의 0번 인덱스는 변수형이므로 첫번째 자리 고정.
두번째자리부터 &, *, [], 변수명에 따라 자리 조정
1번 인덱스부터 뒤집은 상태에서 요소를 집어넣기 시작
&, *는 그대로 넣어주면 되고, 변수명의 경우 변수형과 같이 뒤집혀지면 안되기 때문에 따로 저장후 다시 뒤집어준다.
[]의 경우 뒤집혀지면 ][로 나오기 때문에 ]가 식별되면 []를 추가해주고 index를 조정시킨다.
이후 재분류된 A(배열, 참조, 포인터들)과 B(변수명) 그리고 변수형을 합쳐주면된다.
변수형 + A + " " + 변수명.reverse()
"$변수형$A ${변수명.reverse()}"
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val input = readLine().replace("[,|;]".toRegex(), "").split(" ").also {
val common = it[0]
for (i in 1 until it.size) {
val sb = StringBuilder()
val name = StringBuilder()
sb.append(common)
var idx = it[i].length - 1
it[i].reversed().forEach {
when (it) {
'&', '*' -> sb.append(it)
in 'a'..'z', in 'A' .. 'Z' -> name.append(it)
']' -> {
sb.append("[]")
idx--
}
}
}
val result = "$sb ${name.reversed()};"
if (i < it.size - 1) bw.appendLine(result) else bw.append(result)
bw.flush()
}
}
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
27160번: 할리갈리 (0) | 2024.03.29 |
---|---|
20528번: 끝말잇기 (0) | 2024.03.29 |
4447번: 좋은놈 나쁜놈 (0) | 2024.03.28 |
8949번: 대충 더해 (0) | 2024.03.28 |
2290번: LCD Test (0) | 2024.03.28 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!