꾸준하게 거북이처럼

백준 17413번 - 파이썬 (단어 뒤집기2) 본문

Computer Science/자료구조

백준 17413번 - 파이썬 (단어 뒤집기2)

somm12 2022. 7. 15. 09:02
 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

<> 괄호 사이에 있는 단어는 제외 한 단어를 뒤집는 문제로, 공백이나 < 여는 괄호를 만나면 stack.pop을 이용해서 단어를 뒤집는 방법을 생각했다. 단어가 아닌 태그는 바로 결과 값을 출력할 문자열에 추가하는 방식으로 구현했다. 여괄호와 닫는 괄호의 개수가 동일하지 않을 때 즉 괄호 안에 문자를 읽는 상태이기 때문에 이는 바로 문자열에 뒤집지 않고 하나씩 추가했다.

내 코드

import sys
arr = sys.stdin.readline().rstrip()
c1 = 0
c2 = 0
ans = ""
stack = list()
for val in arr:
    if val == "<":
        c1 += 1
        while stack:
            ans += stack.pop()
        ans += val
    elif val == ">":
        c2 += 1
        ans += val
    elif c1 != c2:
        ans += val
    elif val == " ":
        while stack:
            ans += stack.pop()
        ans += val
    else:
        stack.append(val)

while stack:
    ans += stack.pop()
print(ans)
# 최대 문자열개수가 10만이기 때문에 for 중복문은 되도록이면 피한다.

 

하지만 더 간단한 코드가 없을 까 고민했고, <xx> 이 부분을 제외하는 단어를 뒤집으면 되기 때문에 <> 이 두 괄호르 중심으로 split을 하는 것을 시작으로 코드를 짤 수 있을 것 같았다. 하지만 잘 떠오르지 않아 위의 방법으로 해결했다.

이 문제를 맞힌 사람의 코드를 살펴보니,

replace 내장함수를 이용해서 모든 괄호는 동일하게 바꿔서 split을 하는 방법을 사용했다.

 

a=input()
b=a.replace('>','<').split('<')
s=""
for i in range(len(b)):
  if i%2:
      s+='<'+b[i]+'>'
  else:
    c=b[i].split()
    s+=' '.join([d[::-1] for d in c])
print(s)

괄호가 포함된 문자열에서 괄호를 중심을 split를 하게 되면 괄호 안의 모든 단어는 인덱스가 홀수가 됨을 알 수 있다. 왜냐하면 < , 괄호 안 문자열, > => 항상 이 세 덩어리 앞 뒤에 단어가 올 수 있기 때문.

ex) <open>tag<close> 일 때 replace('>','<') 한 뒤, split('<') => ['', 'open', 'tag', 'close', '']

- 따라서 인덱스가 홀수인 경우에서는 태그에 해당하므로 양 쪽에 양 괄호와 함께 결과를 담을 문자열 s에 포함.

- 아닌 경우 -> 뒤집어야하기 때문에(태그가 포함되지 않은 단어만 담긴 문자열에서 공백으로 한 번더 split) ex) ['abc','def'] 

for in 반복을 통해 [::-1] 문자열을 뒤집는 슬라이싱 방법을 통해 뒤집고 s에 포함해준다.

** replace를 이용해서 특정한 문자열을 제외하고 split하는 것이 문제를 풀기 위한 큰 힌트라고 생각한다.

 

 

 

'Computer Science > 자료구조' 카테고리의 다른 글

백준 17298번 - 파이썬  (0) 2022.07.16
백준 10799번 쇠막대기 - 파이썬  (0) 2022.07.15
백준 1406번 파이썬  (0) 2022.07.13
백준 1874번 - 파이썬  (0) 2022.07.12
백준 9012번 괄호 - 파이썬  (0) 2022.07.11
Comments