1 minute read

백준 문제 중 17413번

https://www.acmicpc.net/problem/17413

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자(‘a’-‘z’), 숫자(‘0’-‘9’), 공백(‘ ‘), 특수 문자(‘<’, ‘>’)로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. ’<’와 ‘>’가 문자열에 있는 경우 번갈아가면서 등장하며, ‘<’이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 ‘<’로 시작해서 ‘>’로 끝나는 길이가 3 이상인 부분 문자열이고, ‘<’와 ‘>’ 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.


풀이

생각해야 될 조건이 많아서 까다로운 문제였다.

입력받은 문자열을 스캔하면서 경우를

  1. alphanumeric
  2. alphanumeric 사이의 공백 ‘ ‘
  3. ’<’
  4. 스캔 종료후에 stk이 차있을 경우 로 나누어 생각해보자
  • 1 의 경우 순서를 뒤집어야 하므로 스택에 저장을 하고 있다가 ‘ ‘이나 ‘<’를 만나면 pop을 이용해 역순으로 ans에 더해준다

  • 2 의 경우 위에서 말했듯 stk이 빌때까지 pop을해 ans이 더해주되 공백의 문자열 다음 스캔을 위해 i+=1을 해준다.

  • 3 의 경우는 원래 순서를 유지 하므로 ‘>’를 만나기 전까지 ans에 직접 더한다. 단. stk이 비어있지 않다면 ‘<>’전에 만난 alphanumeric을 역순으로 ans에 더해준다.

  • 4 의 경우는 stk에 alphanumeric이 남은채로 문자열이 종료 되는경우(alphanumeric이 문자열 마지막) 이므로 stk이 빌때까지 ans에 더해준다.

words = input().strip()

def reverse_2(words:str)->str:
    
    a = len(words)
    stk = []
    ans = ''

    i = 0
    while i<a:

        if words[i].isalnum():
            stk.append(words[i])
            i+=1

        elif words[i] is ' ':
            while stk:
                ans+=stk.pop()
            ans+=' '
            i+=1

        elif words[i] is '<':
            while stk:
                ans+=stk.pop()

            while words[i] is not '>':
                ans+=words[i]
                i+=1
            ans+='>'
            i+=1
    while stk:
        ans+=stk.pop()
    return ans.strip()

print(reverse_2(words))
<int><max>2147483647<long long><max>9223372036854775807
<int><max>7463847412<long long><max>7085774586302733229

배운점

  1. 문자열을 다룰때 공백 조건이 있다면 웬만하면 strip()을 고려 해보자
  2. self.isalnum() 메소드

Leave a comment