[백준] 3568번 - iSharp

Jaehwan Lee·2021년 2월 6일
1

백준

목록 보기
2/5
post-thumbnail

백준 온라인 저지에 수록되어있는 문제의 설명과 풀이 및 소스 코드를 작성한 글입니다.

💡 문제

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

출력

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

예제 입력 1

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

예제 출력 1

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

💡 풀이

문자열 처리가 능숙하다면 매우 쉬운 문제이었을 것이며 파이썬으로 풀어서 split() 함수나 replace() 함수 덕에 훨씬 쉽게 풀었던 것 같다. C++이었다면 아주 약간 더 코드가 길어졌을 것이다.

콤마나 세미콜론으로 분리할 수도 있겠지만 본인은 공백으로 분리하였다. 입력받은 문자열을 공백으로 먼저 분리한 뒤 기본 변수형만을 따로 저장한다.

즉, int& a*[]&, b, c*;을 입력받았다면 먼저 4개로 분리한 뒤, int&만 따로 저장한다.

그 다음 콜론과 세미콜론을 제거한다. 나중에 출력에서 마지막에 세미콜론 하나만 추가해주면 된다.

이제부턴 출력인데 기본 변수형(int&)를 출력하고 만약 변수명과 추가적인 변수형이 a&[]이었다면 []&a와 같이 거꾸로 출력해야 하므로 뒤에서부터 출력한다. 대신 []만은 따로 또다시 뒤집기는 힘드니 if 조건문을 사용한다.

마지막으로 변수명과 세미콜론을 출력한다.


💡 소스 코드

# 입력
string = input()

# 공백으로 분리
string_list = string.split(' ')

# 기본 변수형만 따로 저장
basic_type = string_list[0]
del string_list[0]

for s in string_list:
    # ','와 ';' 제거
    s = s.replace(",", '').replace(";", '')

    # 기본 변수형 출력
    print(basic_type, end='')

    # 뒤에서 부터 출력
    for i in range(len(s) - 1, 0, -1):
        # 알파벳이 아닌 추가적인 변수형 출력
        if not s[i].isalpha():
            if s[i] == ']':
                print('[', end='')
            elif s[i] == '[':
                print(']', end='')
            else:
                print(s[i], end='')

    # 공백 출력
    print(' ', end='')

    # 기본 변수명(알파벳) 출력
    for i in range(len(s)):
        if s[i].isalpha():
            print(s[i], end='')

    # 세미콜론(';') 출력
    print(';')

💡 풀이 후기

예제 입력이 한 개 밖에 없어서 문자(기본 변수명)의 입력이 항상 a, b, c처럼 글자 수가 한 개인줄 알고 처음에 한번 틀렸다. 항상 여러 가능한 테스트 케이스를 생각해 보아야겠다.

profile
느리더라도 꾸준히 멈춤 없이

0개의 댓글