[BOJ] 17413 - 단어 뒤집기 2
사용 언어: Python3
문제
코드
내 풀이
# 문자열을 tag("<>") 기준으로 나누기
def my_split(S):
ret = list()
ptr = 0
# 태그가 없다면
if S.count('<') == 0:
ret.append(S)
return ret
# 태그가 있다면
while ptr < len(S):
if S[ptr] == '<':
src = ptr
dest = S.index('>',ptr) + 1 # ptr 이후부터 '>' 찾기
ret.append(S[src:dest:1]) # src부터 dest까지 slicing
ptr = S.index('>',ptr) + 1
elif '<' in S[ptr:]: # 태그가 있다면
src = ptr
dest = S.index('<',ptr)
ret.append(S[src:dest:1])
ptr = S.index('<',ptr)
else: # 태그가 없다면
ret.append(S[ptr:])
ptr = len(S)
return ret
S = input()
chunks = my_split(S) # 태그 기준 split
ans = list() # 정답 리스트
# make ans
tmp = list() # 뒤집은 단어를 잠시 보관해둘 리스트
for chunk in chunks:
if '<' in chunk:
ans.append(chunk) # 태그는 뒤집지 않는다
else:
for u in chunk.split():
tmp.append(u[::-1]) # 단어는 공백으로 구분하여 뒤집는다
ans.append(" ".join(tmp)) # 공백은 다시 채워넣기
tmp.clear()
# ans.extend([_ for _ in chunk.split()]) # 맨 껍데기 벗기고 추가
print("".join(ans))
- 무려 한시간이 걸렸다..ㅜㅜ
- 그래도 결과는 정답!
- 로직은 다음과 같다.
my_split()
를 이용해 태그를 기준으로 split 하여 chunk를 만든다.
(chunk 안에 있는 단어들 사이에는 공백이 포함되어 있다.)- 예)
<ab cd>ef gh<ij kl>
➡️<ab cd>
,ef gh
,<ij kl>
- 예)
- chunk들을 순회하며, 단어(태그 포함X)만 뒤집는다.
- chunk 중, 태그가 아니면서 공백이 포함되어 있는 경우
- 공백으로 구분한다.
- 각각의 단어를 뒤집는다.
- 뒤집어진 단어들 사이에 공백을 다시 채워넣은 뒤 chunk로 만든다.
- chunk들을 join하여 답을 출력한다.
다른 풀이
S= input()
tmp = "" # tmp에는 임시로 단어를 담는다 (뒤집기 위해)
ck = False
ans = "" # 정답
for x in S:
if x == ' ':
if not ck: # 단어
ans += tmp[::-1] + " " # 단어 뒤집기
tmp = "" # tmp clear
else: # 꺽쇠가 열려있다면
ans += " " # 뒤집지 않는다
elif x == '<':
ck = True
ans += tmp[::-1] + "<" # 단어 뒤집기
tmp = "" # tmp clear
elif x == '>':
ck = False
ans += ">"
else: # 알파벳과 숫자
if ck: # 꺽쇠가 열려있다면
ans += x
else:
tmp += x
ans += tmp[::-1]
# 지금 "<"나 " "를 만났을 때 tmp를 뒤집어서 출력하게끔 되어있다.
# 따라서 맨 마지막에 단어가 오는 경우는 담아놓은 tmp를 출력할 수 없다.
# 따라서 마지막에 tmp를 뒤집어서 출력을 한 번 더 해준다. (만약 tmp가 비어있다면 뒤집어도 빈문자열이기 때문에 영향을 끼치지 않는다.)
print(ans)
- 꺽쇠가 열려있는지 상태를 체크하는
ck
변수를 활용했다. - 조건문이 복잡하기 때문에 모든 조건을 잘 체크하는 것이 중요하다.
💛 개인 공부 기록용 블로그입니다. 👻