티스토리 뷰
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
그리디 문제이다.
일단 식에서 최소값이 되게하려면 마이너스 부호가 나온 곳부터 다음 마이너스 부호가 나올 곳까지 괄호를 쳐주면 된다.
이를 이용해서 문제를 풀어보면,
- 일단 식의 첫번째 문자는 무조건 숫자이므로, 숫자를 읽어서 sum에다 저장해준다
 - 두번째 문자부터 읽는데, 해당 문자가 마이너스이면, 괄호를 쳐서 괄호 안에 해당하는 모든 숫자의 합을 현재 sum에다가 빼준다.
 - 만약 해당 문자가 플러스이면, 역시나 마이너스부호가 나올때까지 모두 더해서 sum에다 더해준다.
 - 문자열을 숫자로 파싱해주는 메서드를 따로 만들었다. 리턴값은 pair 클래스로, 파싱된 숫자가 끝난 인덱스와, 파싱된 숫자를 반환한다.
 - operation 메서드는 괄호치는 메서드이다. 즉, 마이너스부호가 나올 때까지 모든 값을 숫자로 파싱하고, 더해준다. 리턴값은 더해진 숫자의 합과, 연산이 끝난 자리의 인덱스-1 이다.
 
내가 한 실수는
- 플러스가 먼저나오는 경우를 생각 안했다.
 - 숫자 문자열 처리를 처음에 그냥 인덱스 하나로 받아버렸다 (--) 매우 초보적인 실수..
 - 마이너스부터~ 마이너스 나오기 전까지 괄호 칠 때, 괄호 시작 인덱스 인자 넘겨주는데에서 마이너스 인자부터 넘겨줘버렸다. 이러면 괄호를 아예 못치게된다! 따라서 해당 인덱스 +1 을 넘겨줘야한다. 또한, 앞으로 시작할 인덱스를 다시 넘겨받을 때에는 인덱스-1을 해줘야한다. 그래야만 '-'부호가 포함된다
 
import java.util.*;
import java.io.*;
class pair{
	int sum;
	int idx;
	pair(int sum, int idx){
		this.sum=sum;
		this.idx=idx;
	}
}
//logic
//-을만나면 -만난 이후~ 다시 -을만날때까지의 숫자들을에 괄호를 친다.
public class Main {
	public static void main(String[]args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[]s;
		s=br.readLine().split("");
		pair p= parseToInt(0,s);//첫숫자를 숫자로 바꾸어서 저장한다. 
		int sum = p.sum;
		int idx=p.idx;
		
		
		for(int i = idx ; i < s.length;i++) { //첫번째 연산자부터시작 
			if(s[i].equals("-")) { //연산자가  - 라면, 괄호치기 
				pair p2 = operation(i+1,s);
				i = p2.idx;  // 인덱스변경 
				sum-=p2.sum; // 다 더해준 연산자를 -에서 빼준다.
			}
			else if(s[i].equals("+")) { //플러스 연산자 
				pair p3 = operation(i+1,s); //다 더해준다. 
				i=p3.idx;
				sum+=p3.sum;
				
			}
		}
		System.out.println(sum);
	}
	
	private static pair parseToInt(int idx, String[]s) { //문자열 -> 숫자로 파싱 
		String number="";
		while(idx<s.length && !s[idx].equals("+") && !s[idx].equals("-")) {
			number+=s[idx];
			idx++;
		}
		pair p = new pair(Integer.parseInt(number),idx);
		return p;
	}
	
	
	private static pair operation(int idx, String[]s) {
		int sum = 0;
		while(idx<s.length&&!s[idx].equals("-")) {
			if(!s[idx].equals("+") && !s[idx].equals("-")) { //숫자일 때 
				pair tmp = parseToInt(idx,s);
				sum+=tmp.sum;
				idx=tmp.idx;
			}
			else idx++; //숫자가 아닐 때 
		}
		pair p = new pair(sum,idx-1);
		return p;
	}
	
}
'algorithm > problem solving' 카테고리의 다른 글
| BOJ 14501 퇴사 (0) | 2020.06.28 | 
|---|---|
| BOJ 17144 미세먼지 안녕! (0) | 2020.06.28 | 
| BOJ 16234 인구이동 (0) | 2020.06.17 | 
| BOJ 1976 여행 가자 (0) | 2020.05.26 | 
| BOJ 2110 공유기 설치 (0) | 2020.05.14 | 
					댓글