알고리즘/백준
백준-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 이라는 성질을 활용하여 문자열을 뒤집을 수 있었다.
- 구현된 내용은 다음과 같다.
- 우선 괄호 내부인지 외부인지 구분을 위해 check변수를 유지한다. check == 1이면 괄호밖, -1이면 괄호 내부이다.
- < 괄호를 만나면 이전까지 stack에 넣어둔 문자들은 괄호 외부라는 의미이기 때문에 pop연산을 통해서 결과에 넣어주면 문자가 뒤집어서 들어간다.
- > 괄호를 만나면, 괄호 내부에 대한 값을 처리한 것을 의미하기 때문에 이는 뒤집지 않고 결과에 넣어주기 위해서 pop(0)을 활용해서 결과로 넣어준다.
- 그리고 괄호 외부이면서 공백을 만나게 되면 한 단어라는 것을 뜻하기 때문에 이 또한 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을 이용해서 하나씩 처리했던 것을 한번에 처리할 수 있었다.
- 결과적으로 실행 시간을 많이 단축시킬 수 있었다.