[백준] 2504번 - 연산자 끼워넣기

김멉덥·2024년 3월 19일
0

알고리즘 공부

목록 보기
132/171
post-thumbnail
post-custom-banner

골드 5 - https://www.acmicpc.net/problem/2504

Code

input_str = input()

arr = []    # 괄호를 넣어가면서 계산한 값을 담을 배열

open_cnt = 0    # 여는 괄호 개수 카운트
close_cnt = 0   # 닫는 괄호 개수 카운트

for i in range(len(input_str)):
    # 괄호의 시작인 값이면 -> 배열에 우선 넣어주기
    if(input_str[i] == '(' or input_str[i] == '['):
        arr.append(input_str[i])
        open_cnt += 1

    # 괄호의 끝인 값이면 -> 짝이 지어지는지 확인
    else:
        close_cnt += 1
        # 배열이 비어있는데 닫는 괄호가 들어오면 잘못된 괄호열
        if(len(arr) == 0):
            break
            
        # () 짝지어짐
        if(input_str[i] == ')' and arr[-1] == '('):
            arr.pop(-1)
            arr.append(2)   # () 값인 2 넣어주기
            if (len(arr) >= 2 and isinstance(arr[-2], int)):    # 그 전에 계산된 수가 들어가있다면 더해서 배열 업데이트
                sum_tmp = arr[-2] + arr[-1]
                arr.pop(-1)
                arr.pop(-1)
                arr.append(sum_tmp)
            continue
        # [] 짝지어짐
        if (input_str[i] == ']' and arr[-1] == '['):
            arr.pop(-1)
            arr.append(3)   # [] 의 값인 3 넣어주기
            if (len(arr) >= 2 and isinstance(arr[-2], int)):    # 그 전에 계산된 수가 들어가있다면 더해서 배열 업데이트
                sum_tmp = arr[-2] + arr[-1]
                arr.pop(-1)
                arr.pop(-1)
                arr.append(sum_tmp)
            continue
        # ( X ) 의 경우
        elif(len(arr) >= 2 and input_str[i] == ')' and arr[-2] == '('):
            if (isinstance(arr[-1], int)):
                tmp = arr[-1] * 2
                arr.pop(-1)
                arr.pop(-1)
                arr.append(tmp)
                if(len(arr) >= 2 and isinstance(arr[-2], int)):
                    sum_tmp = arr[-2] + tmp
                    arr.pop(-1)
                    arr.pop(-1)
                    arr.append(sum_tmp)
            continue
        # [ X ] 의 경우
        elif(len(arr) >= 2 and input_str[i] == ']' and arr[-2] == '['):
            if(isinstance(arr[-1], int)):
                tmp = arr[-1] * 3
                arr.pop(-1)
                arr.pop(-1)
                arr.append(tmp)
                if(len(arr) >= 2 and isinstance(arr[-2], int)):
                    sum_tmp = arr[-2] + tmp
                    arr.pop(-1)
                    arr.pop(-1)
                    arr.append(sum_tmp)
            continue
#
#     print(arr)
#     print("==")
#
# print(arr)

# 정답 출력
if(len(arr) != 1 or open_cnt != close_cnt):
    print(0)
else:
    print(arr[0])

풀이 및 해설

What I learned

▶️ isinstance(요소, 확인하고싶은타입)

참고 : https://www.daleseo.com/python-class-type-isinstance/

  • 첫번째로 인자로 넘어온 객체의 데이터 타입이 두번째 인자로 넘어온 타입과 일치하는지 여부를 반환
print(isinstance(1, int))
print(isinstance(1, float))
print(isinstance(333, str))
---
True
False
False
  • 두번째 인자로 여러 데이터 타입을 한 번에 튜플(tuple)로 넘기기도 가능
print(isinstance(1, (int, float)))
print(isinstance(1.5, (int, float)))
print(isinstance("1.5", (int, float)))
---
True
True
False
  • 리스트 내 타입 확인 가능
## 리스트 내 타입 검사
test = [1,2,'3',4,5]

for i in test: 
    print(isinstance(i, int))  ## 리스트 안의 원소들이 int타입인지 검사
    
>>>
True
True
False
True
True
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글