본문 바로가기
백준

백준 1541번 : 잃어버린 괄호

by Huiyeong 2021. 3. 5.

 문제

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

1541 잃어버린 괄호

 

 구현 방법

생각보다 간단한 문제였습니다.

연산자가 +, - 밖에 없기 때문에 수를 나열했을 때 -가 나오면 남은 뒤를 싹 -시켜버리면 최솟값이 나옵니다.

 

예제를 통해 예를 들어보겠습니다.

55-50+40 일 때의 최솟값은 55-(50+40) 일 때 입니다. 이렇게 처음부터 수를 탐색하다 -가 나오면 뒤를 싹 빼줍니다.

 

수를 탐색해야 하기 때문에 문자열을 숫자로 바꾸어 리스트에 넣어줍니다.

처음 입력된 문자열의 길이만큼 반복문을 돌려서 값을 하나하나 확인해줍니다.

charAt() 함수를 이용하여 한 글자씩 가져오고 Character.isDigit() 함수(숫자라면 true, 아니면 false 리턴)를 이용하여 현재 가져온 값이 숫자인지 확인해줍니다.

만약 숫자라면 카운트를 세줍니다. 그러다 연산자가 나오면 카운트를 멈춰주고 substring을 이용해 현재 위치-cnt부터 현재 위치까지 잘라 리스트에 넣어줍니다. 

만약 들어온 값이 연산자 '-' 라면 음수값을 표현해주기 위해 같이 넣어야하므로 카운트를 세줍니다.

이를 반복하여 입력된 문자를 숫자로 만들어 리스트에 넣어줍니다.

 

리스트를 탐색하면서 -가 나오면 flag = true를 해주어 그 다음 양수값들은 싹 빼줍니다.

하지만 음수값이 나올수도 있으므로 값이 음수일 때의 조건을 추가해줍니다.

 

 구현 코드

package BOJ.Silver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class B1541_잃어버린괄호 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String calc = br.readLine();
		int cnt = 0;
		List<Integer> num = new ArrayList<>();
		int size = calc.length();
		for (int i=0;i<size;i++) {
			char temp = calc.charAt(i);
			if (Character.isDigit(temp)) cnt++; // 숫자라면 cnt++
			else { // 연산자가 나오면
				num.add(Integer.parseInt(calc.substring(i-cnt, i))); // 현재 위치-cnt부터 현재 위치까지 숫자
				cnt = 0;
				if (temp=='-') cnt++; // 연산자지만 마이너스 값을 표현하기 위해 넣어줘야함
			}
		}
		if (cnt>0) num.add(Integer.parseInt(calc.substring(size-cnt, size)));
		
		int ans = num.get(0);
		boolean flag = false;
		for (int i=1;i<num.size();i++) {
			if (num.get(i)<0) { // 음수면
				flag = true; 
				ans+=num.get(i); // 음수 더해줌 = 빼줌 
			}
			else if (flag) ans-=num.get(i); // 음수가 아니지만 음수가 한번이라도 나왔으면 빼줌
			else ans+=num.get(i); // 음수가 한번도 나오지 않았다면 더해줌
		}
		System.out.println(ans);
	}
}

 

정답!

'백준' 카테고리의 다른 글

백준 17298번 : 오큰수  (0) 2021.03.06
백준 1316번 : 그룹 단어 체커  (0) 2021.03.06
백준 1449번 : 수리공 항승  (0) 2021.03.05
백준 14889번 : 스타트와 링크  (0) 2021.03.05
백준 1972번 : 놀라운 문자열  (0) 2021.03.05