일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- DFS기초
- 재귀
- 알고리즘
- CSS
- 코딩테스트
- 백준
- 문자열
- socket.io
- 파이썬
- 그리디알고리즘
- Express
- 코딩테스트실력진단
- 코드트리
- 그리디
- DFS활용
- BFS
- 코테
- django
- DP
- JS
- DFS
- 백준알고리즘
- 자료구조
- 구현
- 스택
- 스택자료구조
- 블챌
- 완전탐색
- react
- react-query
- Today
- Total
꾸준하게 거북이처럼
백준 17413번 - 파이썬 (단어 뒤집기2) 본문
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 |