컴퓨터는 잘못이 없다..
[알고리즘]BOJ_1541_잃어버린 괄호(파이썬 for문에 슬라이싱 같이 쓰기, for문에 split()같이 쓰기) 본문
[알고리즘]BOJ_1541_잃어버린 괄호(파이썬 for문에 슬라이싱 같이 쓰기, for문에 split()같이 쓰기)
도토리까꿍v 2021. 6. 11. 14:25#문제 링크
https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
#문제
https://www.acmicpc.net/problem/1541
잃어버린 괄호
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 27908 13179 10661 47.393%
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고,
가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고,
5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.
입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
예제 입력 1
55-50+40
예제 출력 1
-35
#답안
import sys
input=sys.stdin.readline
#식을 입력받는다.
exp=input().rstrip()
#-를 기준으로 리스트에 각각 담는다.
exp=exp.split('-') #55-50+40 입력 시 ['55','50+40']
result=[]
for exp in exp :
exp=exp.split('+') #덧셈을 기준으로 리스트를 반환
result.append(exp) #리스트를 result리스트에 append한다.
#위 for문의 결과
exp=['55','50+40'] 일 때 [['55'],['50','40']]을 반환한다.
sum=0
for i in range(len(result)) :
for j in range(len(result[i])) :
if i==0 :
sum+=int(result[i][j])
else :
sum-=int(result[i][j])
print(sum)
▲답안 설명
ex1) exp=55 - 50 + 40 일때, 55 - ( 50 + 40 )
ex2) exp=55 + 45 - 50 + 40 - 35 + 45 일때, -> 55 + 45 - ( 50 + 40 ) - ( 35 + 45 )
위의 예를 보면 -뒤에 나오는 숫자들을 괄호로 묶어줘야 가장 작은 값이 나옴을 알 수 있다.
따라서 괄호가 등장하기 전 맨앞 값들은 sum에 누적시키고, 그 뒤의 숫자들은 sum에서 모두 빼주는 식으로 구현하였다.
1) exp=exp.split('-') 를 이용해서 '-'를 기준으로 숫자를 분류해 리스트에 담아주고 55-50+40 입력 시 ['55','50+40']
2) exp=exp.split('+') 를 이용해서 '+'를 기준으로 숫자를 분류해서 이중리스트로 담아주었다. result=[['55'],['50','40']]
3) 이중리스트의 0번째 행에 있는 값들은 sum에 모두 더하고, 1번째 행부터 마지막 행까지에 있는 모든 수는 sum에서 모두 빼도록 구현하였다.
#개선답안
import sys
input=sys.stdin.readline
#식을 입력받는다.
exp=input().rstrip()
#-를 기준으로 리스트에 각각 담는다.
exp=exp.split('-')
sum=0
for num in exp[0].split('+') :
sum+=int(num)
for nums in exp[1:] :
for num in nums.split('+') :
sum-=int(num)
print(sum)
▲개선답안 설명
이중리스트로 만들지 않고 바로 처리하는 방법이 없을까 하다가 찾아낸 방법이다.
for문의 in 에 exp[0].split('+')를 해주면 +를 기준으로 나눈 값들 수만큼 for문을 돌릴 수 있다.
'공부 > 알고리즘(파이썬)' 카테고리의 다른 글
[알고리즘]BOJ_1260_DFS와 BFS(파이썬 2차원 행렬 만들기 DFS, BFS 기본문제) (0) | 2021.06.22 |
---|---|
[알고리즘]BOJ_18111_마인크래프트 (0) | 2021.06.11 |
[알고리즘]BOJ_2564_경비원(파이썬) (0) | 2021.06.10 |