[baekjoon] 1662 압축


✍ 문제풀이

예를 들어, 33(562(71(9)))라는 문자열S가 주어졌다면, 괄호 안은 0이상의 문자열이고 괄호 앞에 붙은 수는 반복되는 횟수를 결정한다.
71(9)는 9가 1번 반복된다는 뜻이므로, 79가 되고 S는 33(562(79))가 된다.
562(79)는 79가 2번 반복된다는 뜻이므로, S는 33(567979)가 된다.
그러므로 압축되지 않은 문자열 S는 3567979567979567979이므로 출력값은 S의 길이인 19가 나온다.

제일 안쪽에 있는 괄호부터 압축을 풀어주어야하므로, stack를 이용해야한다고 생각하였다.

나는 입력을 받은 후, 문자열 종류에 따라 조건문으로 나누었다. '('를 만나면 stack에 이어지는 숫자들을 넣고, ')'를 만났을 때 stack에 넣어뒀던 숫자들을 pop하면서 반복되는 횟수를 곱해주면 길이를 구할 수 있다고 생각했다.

만약 문자열이 숫자일 경우, 결과값으로 리턴될 length를 +1하고, point 변수를 만들어서 숫자값을 저장하였다.

그러다가 '('를 만나게되면, 바로 앞에 있는 숫자(=point)를 multi[]에 넣어주었다. (multi[]는 반복되는 횟수를 저장)
stack[]에는 '('를 만나기 전의 숫자의 길이를 추가했다. 길이값을 구하는 것이기 때문에 실제 값은 필요없다고 생각함!
lengh-1를 한 이유는 '(' 바로 앞의 숫자는 반복될 횟수를 의미하기 때문!! ex) 71(9) -> 79
그리고 다시 length 값을 초기화해주었다.

마지막으로 ')'를 만나면, multi에 있던 값을 pop해 length와 곱하여 괄호로 압축된 부분을 풀어주고, stack에 있던 값을 pop해서 length와 더해주면 '('앞에 있던 숫자와 이어진다. 이것을 반복하면 length에는 압축되지 않은 문자열의 길이가 저장된다!


✍ 내가 작성한 코드


s = input()
 
stack = []
multi = [] # 곱해줄 정수들
length = 0
point = ''


for str in s:

  # 문자열이 숫자일 경우
  if str.isdigit():
    point = str
    length += 1

  # 문자열이 '('일 경우
  elif str == '(':
    multi.append(point)
    stack.append(length-1)
    length = 0

  # 문자열이 ')'일 경우
  else:
    length = int(multi.pop()) * length + int(stack.pop())

print(length)

코드 보러 가기 👉 1662.py


✍ str.isdigit()

문자열이 '숫자'로만 이루어져있는지 확인하는 함수 입니다.

문자가 '단 하나'라도 있다면 False를 반환하고,
모든 문자가 '숫자'로만 이루어져있으면 True를 반환합니다.

사용법
1) str.isdigit("판단하고자 하는 문자열")
2) "판단하고자 하는 문자열".isdigit()

str.isdigit() 은 음수를 뜻하는 '-', 소수점을 뜻하는 '.' 이것들을 숫자가 아닌 문자로 판단을 하기 때문에, 실수나 음수를 판단하지 못합니다.

정리하자면 "오직 0을 포함한 양수형 정수로만 이루어진 문자열"만 isdigit에서 True가 나올 수 있습니다.
추가적으로 지수를 뜻하는 n제곱 2³, 3², 4² 이것도 True가 올 수 있습니다.


✍ 느낀 점

int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method' 이러한 에러가 계속 떠서 뭘까,,고민했는데, pop뒤에 ()를 안붙여서 발생하는 거였다.😂
오랜만에 다른 코드를 참고하지 않고도 해결해서 뿌듯했다 :D

피드백은 언제나 환영입니다.💛

[참고 사이트]
https://blockdmask.tistory.com/556

좋은 웹페이지 즐겨찾기