2 분 소요

사용 언어: Python3

문제

백준 17413

코드

내 풀이

# 문자열을 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))
  • 무려 한시간이 걸렸다..ㅜㅜ
    • 그래도 결과는 정답!
  • 로직은 다음과 같다.
    1. my_split()를 이용해 태그를 기준으로 split 하여 chunk를 만든다.
      (chunk 안에 있는 단어들 사이에는 공백이 포함되어 있다.)
      • 예) <ab cd>ef gh<ij kl> ➡️ <ab cd>, ef gh, <ij kl>
    2. chunk들을 순회하며, 단어(태그 포함X)만 뒤집는다.
      • chunk 중, 태그가 아니면서 공백이 포함되어 있는 경우
      1. 공백으로 구분한다.
      2. 각각의 단어를 뒤집는다.
      3. 뒤집어진 단어들 사이에 공백을 다시 채워넣은 뒤 chunk로 만든다.
    3. 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 변수를 활용했다.
  • 조건문이 복잡하기 때문에 모든 조건을 잘 체크하는 것이 중요하다.


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기