블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 1678. Goal Parser Interpretation를 풀고 작성한 글입니다.
You own a Goal Parser that can interpret a string command
. The command
consists of an alphabet of "G"
, "()"
and/or "(al)"
in some order. The Goal Parser will interpret "G"
as the string "G"
, "()"
as the string "o"
, and "(al)"
as the string "al"
. The interpreted strings are then concatenated in the original order.
Given the string command
, return the Goal Parser's interpretation of command
.
1 <= command.length <= 100
command
consists of "G"
, "()"
, and/or "(al)"
in some order.정규표현식을 사용해서 문제를 풀 수 있다.
이때 []
를 사용할 경우 내부에 있는 문자들 중에 하나여야 한다는 의미이기 때문에 주의해야 한다.
따라서 ()
를 사용해서 그룹으로 만들어주거나 아니면 개별적으로 단어를 입력하면 된다.
이때 몇몇 특수문자의 경우 위에 사용된 것처럼 아예 다른 의미를 가지기 때문에 이스케이프 문자( \
)를 사용해서 해당 문자가 어떤 문법적 의미로서 사용된 것이 아닌 문자 자체로 사용된 것임을 선언해줘야 한다.
접근법을 토대로 문제를 해결하면 아래와 같다.
def solution(s: str) -> str:
import re
return re.sub(r"\(\)", "o", re.sub("\(al\)", "al", command))
아래와 같이 해시 테이블 -파이썬에서의 딕셔너리- 을 사용해서 문제를 해결할 수도 있다.
def solution(command: str) -> str:
answer: str = ""
converted_table: dict[str, str] = { "()": "o", "(al)": "al" }
for character in command:
if character == "G":
answer += character
elif character == "(":
consecutive_word: str = "("
elif character == ")":
consecutive_word += character
answer += converted_table[consecutive_word]
consecutive_word = ""
else:
consecutive_word += character
return answer
좀 더 견고한 풀이는 아래와 같다.
단어가 더 추가되면 해시 테이블에 키와 값만 추가해주면 되기 때문이다.
def solution(command: str) -> str:
answer: str = ""
consecutive_word: str = ""
converted_table: dict[str, str] = {"()": "o", "(al)": "al", "G": "G"}
for character in command:
consecutive_word += character
if consecutive_word in converted_table:
answer += converted_table[consecutive_word]
consecutive_word = ""
return answer
길이가 N인 문자열에 대해 반복문을 그 길이만큼 수행하면 되기 때문에 시간 복잡도는 O(N)이다.