AngelPlayer`s Diary

링크

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

 

 

문제 해석

덧셈과 뺄셈으로 이루어진 식이 입력값으로 주어지고, 이를 괄호를 통해 값을 최소화하도록 만들어야 한다.

 

숫자는 0으로 시작할 수 있다. (ex. 00009)

 

 

 

코드

 

 

 

 

 

 

코드 해석

# idea

음수 이후에 나오는 모든 양수는 괄호를 통하여 음수로 바꿀 수 있고, 음수의 경우 그대로 사용하면 최소값을 구할 수 있다. [ex. -10 + 5 + 7 -> -(10 + 5 + 7) ]

따라서 음수가 나오기 전의 양수는 덧셈을 하고, 나머지의 양수의 경우는 음수로 취급하여 최종 결과 값에 연산을 수행한다. 음수의 경우 따로 부호를 변경할 필요가 없다.

 

# input

입력은 계산식을 문자열 형태 그대로 받아온다.

 

# process

(첫 번째 for문)

반복문을 통해 계산식을 한 단어를 체크하여, - 또는 +가 나오면 숫자 시작 지점(start_number)부터 현재 검사지점까지를 숫자로 변경 후 리스트(number_list)에 저장한다.

이후 시작 지점을 변경한다.

 

마지막 반복이면 시작 지점부터 끝까지를 하나의 값으로 리스트에 저장한다.

 

(두 번째 for문)

숫자를 하나씩 꺼내어 값을 확인한다.

값이 0보다 작은 경우(음수인 경우), 값을 그대로 total에 적용하고, 음수가 나왔음을 표현하는 변수(appear_minus)의 값을 변경한다.

 

값이 0보다 큰 경우(양수인 경우), appear_minus가 0일 때는 현재 값 그대로 total에 적용하고, appear_minus가 1인 경우 부호를 바꾸어(음수화) total에 적용한다.

 

 

 

발생한 문제 & 해결 방안

- 가장 먼저 작성한 방식

처음에는 각각의 숫자를 따로 하지 않고 eval() 함수를 이용하여 문제를 해결하려고 하였으나, 조건에서 0으로 시작하는 숫자가 있는 경우 eval()을 사용하면 error가 발생하였다. (ex. 00009)

-> syntax error : eval leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

 

테스트 케이스에 0으로 시작하는 숫자가 없다면 위 코드로 풀이가 가능하지만, 조건을 해결하기 위해서 일일히 모든 숫자를 int형으로 변환해주고 연산을 수행하여야 한다. 

 

 

 

 

 

해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.

혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!

source : https://github.com/ssh5212/conding-test-practice

공유하기

facebook twitter kakaoTalk kakaostory naver band