알고리즘/백준

백준-17413-단어뒤집기

hong2943 2024. 4. 29. 17:11

구현 코드1

S = input()
S += " " #맨마지막 공백추가
stack = []
result = ""
check = 1
for i in S:
    if i == "<":
        check *= -1
        
        for j in range(len(stack)):
            result += stack.pop() #스택의 성질이용하면 문자열이 뒤집어진다.
    
    stack.append(i)

    if i == ">":
        check *= -1
        
        for j in range(len(stack)):
            result += stack.pop(0) #괄호안은 뒤집지 않음

    if (i == " ") and check == 1:
        #뒤집어지면서 공백이 앞으로가는 것을 위해 공백제거
        stack.pop()
        for j in range(len(stack)):
            result += stack.pop() #문자 뒤집에서 저장
        result += " " #아까 제거했던 공백 추가

print(result)
  • 처음으로 구현한 방법은 stack의 성질을 활용한 코드이다.
  • 이는 바로 해결하지 못해서 타 블로그를 참조하였다.
  • stack의 LIFO 이라는 성질을 활용하여 문자열을 뒤집을 수 있었다.
  • 구현된 내용은 다음과 같다.
    1. 우선 괄호 내부인지 외부인지 구분을 위해 check변수를 유지한다. check == 1이면 괄호밖, -1이면 괄호 내부이다.
    2. < 괄호를 만나면 이전까지 stack에 넣어둔 문자들은 괄호 외부라는 의미이기 때문에 pop연산을 통해서 결과에 넣어주면 문자가 뒤집어서 들어간다.
    3. > 괄호를 만나면, 괄호 내부에 대한 값을 처리한 것을 의미하기 때문에 이는 뒤집지 않고 결과에 넣어주기 위해서 pop(0)을 활용해서 결과로 넣어준다.
    4. 그리고 괄호 외부이면서 공백을 만나게 되면 한 단어라는 것을 뜻하기 때문에 이 또한 pop()연산을 활용하여 단어를 뒤집어준다.
      여기서 포인트는 "단어 " 인데 뒤집으면 " 단어" 형태가 된다. 따라서 pop()하기전에 공백을 제거해주고, 문자열을 뒤집은 후 따로 공백을 넣어주면 해결할 수 있다.

구현 코드2

s = input()

temp = []
result = []

check = 1

for i in s:
    if i == "<":
        check *= -1 # 괄호 확인

        temp.reverse()
        result.append(''.join(temp))
        temp = [i]

    elif i == ">": #괄호 끝
        check *= -1
        temp.append(">")
        #괄호는 뒤집지 않음
        result.append(''.join(temp))
        temp = []
    elif i == " " and check == 1:
        temp.reverse()
        result.append(''.join(temp))
        result.append(' ')
        temp = []
    else:
        temp.append(''.join(i))

if temp:
    temp.reverse()
    result.append(''.join(temp))

print(''.join(result))
  • 위 방식 그대로 하나하나씩 문자열을 처리하면 시간이 아주 오래걸렸다.
  • 그래서 join 메서드와 reverse 메서드를 활용해서 pop을 이용해서 하나씩 처리했던 것을 한번에 처리할 수 있었다.
  • 결과적으로 실행 시간을 많이 단축시킬 수 있었다.

 

문제링크

'알고리즘 > 백준' 카테고리의 다른 글

백준-2606-바이러스  (0) 2024.05.03
백준-1914-하노이 탑  (0) 2024.04.30
백준-1966-프린터 큐  (0) 2024.04.29
백준-11728-배열합치기  (0) 2024.04.12
백준-1181-단어정렬  (0) 2024.04.10