본문 바로가기

알고리즘

백준 19591 <독특한 계산기 >

728x90

좀 까다로운 시뮬레이션 문제이다.

 

이 문제의 접근법은 앞의 연산자와 뒤의 연산자 즉 투 포인터를 이용하는 문제이다.

 

나는 이문제를 위해 연산자와 수를 따로 담기 위해서 두개의 Arraylist를 만들어 줬다.

 

그렇게 해서 하나는 수를 담을 하나는 연산자를 기록해두었다.

 

맨 앞에 - 부호를 처리하기위해서 수식의 맨 앞이 -이면 수를 담는 배열에 0을 넣어주고 부호에 -를 넣어줘 시작을 하도록 진행했다.

 

문제 풀이

  1. 숫자와 부호를 구별해서 각각의 ArrayList에 넣는다 (불필요한 0을 제거하면서 넣어준다)
  2. 시작점과 끝점의 부호를 비교해서 시작점은 증가하도록 끝점은 감소하도록 해서 같을 때까지 진행한다.
  3. 시작점과 끝점이 같을 경우 현재있는 시작점의 수와 끝점의 수를 부호에 맞춰 계산한다.

문제 해결방법의 1번의 따로 분리해서 저장해주는 과정이다.

 

시작점을 지정해줄때 주의할 점!

 

이 두 가지만 예외 처리해주고 아닐 경우 시작점과 끝점부터 비교해주면 된다.

 

이 위에 예외사항들만 아니었다면 쉽게 풀었을 문제 그래서 골드 3이 아닌가 싶다. 예외사항을 생각하고 문제를 푸는 습관을 확실하게 들어야겠다.

 

전체 코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {

	static ArrayList<Long> number;
	static ArrayList<Character> qngh;
	static long start, finish;
	static int starti, finishi;

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		number = new ArrayList<Long>();
		qngh = new ArrayList<Character>();
		String s = br.readLine();
		long value = 0;
		for (int i = 0; i < s.length(); i++) {
			if (s.charAt(i) == '-' || s.charAt(i) == '+' ||
                s.charAt(i) == '*' ||s.charAt(i) == '/') {
				number.add(value);
				qngh.add(s.charAt(i));
				value = 0;
			} else {
				if (value == 0 && s.charAt(i) != '0') {
					value = (s.charAt(i) - '0');
				} else if (value != 0) {
					value *= 10;
					value += (s.charAt(i) - '0');
				}
			}
		}
		number.add(value);
		if (number.get(0) == 0&&!qngh.isEmpty()) {
			starti = 1;
			start = number.get(1) * -1;
		} else {
			start = number.get(0);
		}
		finishi = qngh.size() - 1;
		finish = number.get(number.size() - 1);
		long result = 0;
		if (qngh.size() == 0 || qngh.size() == 1 && number.get(0) == 0) {
			result = start;
		} else {
			while (starti != finishi) {
				char first = qngh.get(starti);
				char last = qngh.get(finishi);
				if ((first == '-' || first == '+') && (last == '*' || last == '/')) {
					long next = number.get(finishi);
					finish = cal( next, finish, qngh.get(finishi));
					finishi--;
				} else if ((first == '*' || first == '/') && (last == '-' || last == '+')) {
					long next = number.get(starti + 1);
					start = cal(start,  next, qngh.get(starti));
					starti++;
				} else {
					long next1 = number.get(starti + 1);
					long start2 = cal(start, next1,qngh.get(starti));
					long next2 = number.get(finishi);
					long finish2 = cal(next2,finish,qngh.get(finishi));
					if (start2 >= finish2) {
						start = start2;
						starti++;
					} else {
						finish = finish2;
						finishi--;
					}
				}
			}
			result = cal(start, finish, qngh.get(starti));
		}
		System.out.println(result);
	}

	private static long cal(long next, long finish2, char character) {
		// TODO Auto-generated method stub
		if (character == '-') {
			return next - finish2;
		} else if (character == '+') {
			return next + finish2;
		} else if (character == '*') {
			return next * finish2;
		} else {
			return next / finish2;
		}
	}

}