Bibbidi Bobbidi Boo

* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...

* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기


Greedy 50문제 풀기

1 / 50(NEW!)

 

탐색 50문제 풀기

0 / 50

 

기초 동적 프로그래밍 50문제 풀기

0 / 50

 

투포인터 10문제 풀기

0 / 10


문제

1541번: 잃어버린 괄호 (acmicpc.net)

 

1541번: 잃어버린 괄호

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

www.acmicpc.net


문제 해결 아이디어: Greedy

값을 최소로 만들기 => 빼기 사이에 있는 괄호가 많도록

55 - 50 - 40 => 그냥 두기

55 - (50 + 40) => 묶기

 

-를 모으는 변수 선언 = minus_numbers

  • 현재 연산자가 -
    • 만약 이전에 -가 모아져 있었다면 => answer - minus_numbers를 빼주고, minus_numbers에 다음값 넣어주기
    • 아니라면 => minus_numbers에 +
  • 현재 연산자가 +
    • 만약 이전에 -가 모아져 있었다면 => minus_numbers에 +
    • 아니라면 => answer - 다음값

구현

내 풀이


import re
import sys
input = sys.stdin.readline

PLUS = '+'
MINUS = '-'

input_data = input().strip('\n')
numbers = list(map(int, re.split('[+|-]', input_data))) # 숫자만 분리
operators = list(re.findall('[+|-]', input_data)) # 연산자만 분리

minus_number = 0 # 현재 쌓여 있는 - 값
answer = numbers[0]

for i, oper in enumerate(operators) :
  if oper == MINUS :
    if minus_number != 0 :
      answer -= minus_number
      minus_number = numbers[i+1]
    else :
      minus_number += numbers[i+1]
  else :
    if minus_number != 0 :
      minus_number += numbers[i+1]
    else:
      answer += numbers[i+1]
else :
  if minus_number != 0 :
    answer -= minus_number
  
print(answer)

 

다른 사람 풀이


exps = input().split('-') # - 기준으로 split해서 리스트에 저장

answer = 0

for i, exp in enumerate(exps) :
    cnt = sum(list(map(int, exp.split('+')))) # + 기준으로 분리후, 모든 값 더하기
    if i == 0: # 첫 번째이면
      answer = cnt
    else :
      answer -= cnt
  
print(answer)

예를 들어 50 - 80 + 70 - 60 + 90 이라고 할 때

50 - (80 + 70) - (60 + 90) 이 최대가 된다.

-를 기준으로 분리, 그 다음 + 끼리 저장한다. 라는 느낌.


메모

걸린 시간

  • 총 53분

Python 문법

  • enumerate
    • for문에서 list의 index와 값 동시에 접근하고 싶을때 사용
  • re
    • 정규 표현식으로 list를 분리할 때 사용
    • split에 정규 표현식을 넣어서 두 가지 이상의 구분자로 list를 분리할 수 있음
    • findall을 사용해서 문자열에서 해당 정규 표현식에 해당되는 것만 찾을 수 있음

마치며

그동안 너무 코딩테스트를 안했구나 + 내가 너무 어렵게 구현했다..

곧 다시 페이스 찾을 수 있겠지 아자자ㅏ자아

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!