뚝딱햄 탈출기

[Python][백준 BOJ Silver II] 1541. 잃어버린 괄호 : enumerate 본문

Algorithm & Data structure/알고리즘 문제 풀이

[Python][백준 BOJ Silver II] 1541. 잃어버린 괄호 : enumerate

hyrmzz1 2023. 10. 29. 00:24

❌ 접근 방식 1

  1. '-'의 인덱스 값을 찾아서
  2. '-' 바로 뒤에 '('를 삽입하고
  3. '-'가 더 나오지 않는다면 문자열 맨 뒤에 ')'를 삽입, '-'가 더 나온다면 그 앞에 ')'를 삽입하기
  4. .eval() 함수를 통해 문자열 자체를 연산

위의 로직으로 코드를 작성해 보았다. ( 사실 이 코드는 공개하기도 부끄럽다만 TIL 삼아 넣는다 ~ )
.find() 를 사용한다면 () 안의 문자에 해당하는 처음 인덱스 값만 반환되기 때문에 for문을 통해 '-'의 인덱스 값을 빈 배열에 넣어주었다.

import sys
expr = sys.stdin.readline().rstrip()

# '-' 찾기
minus_index = []
for i in range(len(expr)):
    if expr[i] == '-':
        minus_index.append(i)

if len(minus_index) == 0:	# '-' 없다면 그냥 전체 연산 (더하기)
    ans = eval(expr)
    print(ans)
else:
    # 첫번째 '-' 뒤와 두번째 '-' 앞에 각각 append('('), append(')')
    expr = expr[:[minus_index[0]]] + '(' + expr[[minus_index[0]] + 1:[minus_index[1]]] + ')'
    ans = eval(expr)
    print(ans)

틀린 이유

else문에서 정말 기괴한 슬라이싱을 작성한 탓이다 .. ^^ㅎ
TypeError: slice indices must be integers or None or have an __index__ method
슬라이싱 할 때는 아무 것도 안들어가거나 (처음과 끝을 뜻함) 정수가 들어가야 한다.
 
그리고 '-'가 2개 포함되는 경우만을 생각하고 작성한 방식이었다.

❌ 접근 방식 2

괄호를 여러개 쳐야 할 때를 고려하며 직접 괄호를 문자열에 삽입하는 방식을 구현하는 건 너무 까다로워서,
괄호를 치는 것과 같이 연산 결과가 나오게 하는 방법에 대해 고민해 보았다.
 

  1. '-' 뒤부터 다음 '-' 앞까지 괄호를 쳐야 최소 값을 얻을 수 있다.
  2. 처음 '-'가 나오기 전까지의 값(= expr[0])은 양수이거나, 더하기 연산으로 이루어져 있기 때문에 eval(expr[0])을 ans에 대입해 준다.
  3. expr[1:]은 괄호로 감싸야하는 것들이다. 내부적으로는 + 연산자로 연결되어 있을 수 있으니 eval 함수를 통해 연산해 주고, 그 값을 ans에서 빼준다. 

import sys
expr = sys.stdin.readline().split('-')

ans = eval(expr[0])
for i in expr[1:]:
    ans -= eval(i)
print(ans)

틀린 이유

입력으로 '00009-00009'를 넣었을 때 Syntax Error가 발생했다.
숫자를 일일이 int형으로 바꿔줘야겠다.

✅ 접근 방식 3

접근 방식 2와 같은 로직으로 진행했으나, 숫자를 모두 int형으로 변환하기 위해 '+'에 대해서도 split 해주었다.

import sys

expr = sys.stdin.readline().rstrip().split('-')
ans = 0
# '-' 나오기 전
num = expr[0].split('+')
for i in num:
    ans += int(i)

# ()로 묶을 곳
for j in expr[1:]:
    num = j.split('+')
    for l in num:
        ans -= int(l)

print(ans)

정답이긴 하나, 반복되는 코드가 많아 enumerate() 를 사용해 아래와 같이 코드를 수정했다.

import sys
expr = sys.stdin.readline().rstrip().split('-')
ans = 0
for i, val in enumerate(expr):
    num = val.split('+')
    for j in num:
        if i == 0:
            ans += int(j)
        else:
            ans -= int(j)

print(ans)

 


enumerate

진정한 TIL, enumerate 함수!
 

enumerate()는 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.

값도, 인덱스 값도 모두 얻을 수 있는 함수라 요긴하게 사용했다. 이 포스팅을 보고 다양한 사용법을 익혔다.
 


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

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

Comments