문제풀이/String

[CodingTest] BOJ17413 단어뒤집기2 ( 문자열 ) with Python

IT록흐 2023. 6. 9. 10:12
반응형
 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

 

◎ 문제풀이 

 

문자열을 조작하는 문제이다. 파이썬은 다양한 문자열 조작 함수를 제공하기에 간편하게 풀 수 있다.  문제의 목적은 태그(특수문자), 공백(특수문자)로 구분되는 문자열을 뒤집기이다. 문자열을 뒤집는 함수인 reverse()와 특수문자를 구분하는 isalnum()을 이용하면 문제에 쉽게 접근할 수 있다.

 

1) Pointer 하나를 만들고 문자열을 탐색한다. 

2) 태그를 만나면 태그가 끝날때 까지 Pointer를 1씩 증가한다

3) 공백을 만나면 Pointer를 1 증가한다. 

4) 문자열을 만나면 문자열 구간을 탐색하고 뒤집는다. 

 

 

◎ 코드 

import sys
input = sys.stdin.readline

st = list(input().rstrip())

i = 0 
while i < len(st):
  if st[i] == "<" : #태그를 만나는 경우
    while st[i] != ">" : 
      i += 1
    i += 1 

  elif st[i].isalnum() : #문자열을 만나는 경우
    #구간탐색
    start = i 
    while i<len(st) and st[i] != " " and st[i] != "<" :
      i += 1
    #문자열 뒤집기
    tmp = st[start:i]
    tmp.reverse()
    st[start:i] = tmp

  else : i += 1 # 공백을 만나는 경우

#출력
print("".join(st)[:])

 

 

번외로

 

나는 문자열이 아닌 자료구조 관점으로 접근했다.

 

1) 입력받은 문자를 큐에 넣는다.

2) 태그를 만나면 태그가 끝날때까지 큐를 POP한다.

3) 공백을 만나면 큐를 POP 한다.

4) 문자를 만나면 문자를 큐에서 POP하여 STACK에 PUSH하고 문자열이 끝나면 다시 STACK을 POP하여 문자열을 뒤집는다.

 

 

◎ 코드 

from collections import deque
import sys
input = sys.stdin.readline

result = []
stack = []
q = deque(list(input().rstrip())) #큐에 문자 넣기

while q :
  char = q.popleft();

  if char == "<" :
    result.append(char)
    while char != ">"  :
      char = q.popleft()
      result.append(char)

  elif char == " " : result.append(char)
    
  else : 
    stack.append(char)
    while q[0] != " " and q[0] != "<" :
      char = q.popleft()
      stack.append(char)
      if not q : break

    while stack :
      result.append(stack.pop())

print("".join(result)[:])

 

 

 

 

반응형