백준 17413 - 단어 뒤집기 2

Song_MinGyu·2022년 12월 20일
0

Algorithm

목록 보기
22/30
post-thumbnail

백준 1715 - 카드 정렬하기

문제

https://www.acmicpc.net/problem/17413

풀이

문제 이해

  • 문제를 읽고 규칙대로 구현하는 문제
  • 태그(<>)에 쌓인 단어들은 뒤집지 않고 그대로 출력한다.
  • 문자 단위로 뒤집지 않고 단어 단위로 문자들을 뒤집는다 즉, 단어 내에서 인덱스를 맞춰야한다.

문제 접근

사실상 문제 접근 자체는 어렵지 않고 문제와 예제에서 보여준 규칙 그대로 구현하면 해결 할 수 있다.

잘못된 접근

태그와 단어를 분리하고 태그에 위치한 곳과 문자가 위치한 곳을 다른 기호로 대체한다. 그리고 대체된 문자열을 필요에 따라 읽어낸다.

이런 식으로 접근했으나 구현 코드가 상당히 길어지고 복잡해졌다
그 결과

인덱스 에러가 나왔는데 코드가 길어지고 복잡해져 디버깅도 못했다...

# 틀린 풀이 방법!!
import sys
from collections import deque

string = sys.stdin.readline().rstrip()
tag = deque()
word = deque()

def solution(string: str, tag: deque, word: deque):
    while string.find("<") != -1 and string.find(">") != -1:
        start_idx = string.find("<")
        end_idx = string.find(">")
        tag.append(string[start_idx:end_idx+1])
        string = string.replace(string[start_idx:end_idx+1],"|",1)
    return string

string = solution(string,tag,word)
word = string.replace("|"," ").split(" ")
word_deque = []
for i in word:
    if i != "":
        word_deque.append(deque(i))
        string = string.replace(i,"+")

cnt = 0
for i in string:
    if i == "|":
        print(tag.popleft(),end="")
    else:
        if i == " ":
            print(" ",end="")
        else:
            for i in range(len(word_deque[cnt])):
                print(word_deque[cnt].pop(),end="")
            cnt += 1
print()

옳은 접근

결국 꽤 많은 시간을 투자하고 문제를 해결하지 못해 다른 분들의 풀이를 참고하여 풀어보았다.

import sys
string = list(sys.stdin.readline().rstrip()) # 입력 리스트화

idx = 0
start = 0
end = 0
while idx < len(string):
    #태그 발견
    if string[idx] == "<":
        idx += 1
        while string[idx] != ">":
            idx += 1
        idx += 1
    #태그는 그대로 유지되어야 하므로 태그 끝 '>' 다음 위치까지 이동시켜야 한다.

    #isalnum ?? => 해당 문자가 특수기호가 아닌 알파벳, 숫자인지 아닌지 파악하는 함수
    elif string[idx].isalnum():
        start = idx #단어를 반대로 뒤집어야하므로 시작 위치 저장

        # 문자열 끝까지 도달하거나, 새로운 태그 위치 잡을 때 까지 인덱스 추가
        while idx < len(string) and string[idx].isalnum():
            idx += 1

        word = string[start:idx]
        word.reverse() #뒤집기 
        string[start:idx] = word #뒤집은 단어 교체하기

    # 띄워쓰기 일 때는 아무런 동작을 하지 않아야하므로 그대로 건너간다.
    else:
        idx += 1

print("".join(string))
왜 못풀었나?
  1. 문제에서 필요한 태그별 위치 구분, 그리고 단어별 구분해내는 로직 파악하는 것이 부족했다.
    옳은 방법은 태그 기호를 찾으면 다시 반복문을 돌려 태그를 빠져 나올때 까지 인덱스를 증가시킨다. 단어를 구분하는 방법 또한 같은 방법을 이용했다.

  2. isalnum() 함수 존재유무 파악 못함
    해당 함수 하나만 사용하여 문자가 특수문자인지 아닌지 쉽게 파악할 수 있었다.

후기

아직 구현 부분에서 많이 부족함을 느낀다. 조금 더 연습이 필요한 것 같다.

profile
Always try to Change and Keep this mind

0개의 댓글