728x90
좀 까다로운 시뮬레이션 문제이다.
이 문제의 접근법은 앞의 연산자와 뒤의 연산자 즉 투 포인터를 이용하는 문제이다.
나는 이문제를 위해 연산자와 수를 따로 담기 위해서 두개의 Arraylist를 만들어 줬다.
그렇게 해서 하나는 수를 담을 하나는 연산자를 기록해두었다.
맨 앞에 - 부호를 처리하기위해서 수식의 맨 앞이 -이면 수를 담는 배열에 0을 넣어주고 부호에 -를 넣어줘 시작을 하도록 진행했다.
문제 풀이
- 숫자와 부호를 구별해서 각각의 ArrayList에 넣는다 (불필요한 0을 제거하면서 넣어준다)
- 시작점과 끝점의 부호를 비교해서 시작점은 증가하도록 끝점은 감소하도록 해서 같을 때까지 진행한다.
- 시작점과 끝점이 같을 경우 현재있는 시작점의 수와 끝점의 수를 부호에 맞춰 계산한다.
문제 해결방법의 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;
}
}
}
'알고리즘' 카테고리의 다른 글
백준 1238 <파티> (0) | 2020.10.28 |
---|---|
백준 2002 <추월> (0) | 2020.10.27 |
백준 3691 <컴퓨터 조립> (0) | 2020.10.24 |
백준 1976 <여행가자> (0) | 2020.10.23 |
백준 19582 <200년간 폐관수련했더니 PS 최강자가 된 건에 대하여> (0) | 2020.10.17 |