백준 - greedy - 1541 - 잃어버린 괄호 - 자바[JAVA]
세준이는 양수와 +,-, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
첫째 줄에 식이 주어진다. 식은 '0'~'9', '+', '-' 만으로 이루어져 있고,
가장 처음과 마지막 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다.
수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
포인트는 덧셈 연산을 먼저 계산 하는 것 !!
출력
첫째 줄에 정답을 출력한다.
예제 입력
55-50+40
예제 출력
-35
소스 코드
package com.greedy1541;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = Integer.MAX_VALUE;
String[] subtraction = sc.nextLine().split("-"); // -를 기준으로 구분
for(int i = 0; i < subtraction.length; i++ ){
int temp=0;
// 뺄셈으로 나뉜 토큰을 덧셈으로 분리하여 해당 토큰을 더한다.
String[] addition = subtraction[i].split("\\+");
// 덧셈으로 나뉜 토큰들을 모두 더한다.
for(int j = 0; j < addition.length; j++ ) {
temp += Integer.parseInt(addition[j]);
}
// 첫 번째 토큰인 경우 temp 값이 첫 번째 수가 됨
if ( sum == Integer.MAX_VALUE){
sum = temp;
} else {
sum -= temp;
}
}
System.out.println(sum);
}
}
BufferedReader , StringTokenizer를 이용하는 방법
package com.greedy1541;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
int sum = Integer.MAX_VALUE;
StringTokenizer subtraction = new StringTokenizer(br.readLine(), "-");
while(subtraction.hasMoreTokens()){
int temp = 0;
StringTokenizer addition = new StringTokenizer(subtraction.nextToken(),"+");
while(addition.hasMoreTokens()){
temp += Integer.parseInt(addition.nextToken());
}
if(sum == Integer.MAX_VALUE) {
sum = temp;
} else {
sum -= temp;
}
}
System.out.println(sum);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.util.Scanner;
public class Main {
static int min = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String[] str = input.split("-");
min += sum(str[0].split("[+]"));
for (int i = 1; i < str.length; i++ ) {
min -= sum(str[i].split("[+]"));
}
System.out.println(min);
}
static int sum(String[] input) {
int result = 0;
for (String num : input ) {
result += Integer.parseInt(num);
}
return result;
}
}
1. str 배열에는 입력한 (input)문자열에 -(뺄셈)을 구분점으로 담는다.
2. min 전역 변수에는 sum()함수를 사용하여 '+'(덧셈) 기준으로 먼저 result에 담아 리턴하여 min에 담는다.
sum() 함수는 입력한 input 배열을 Integer로 자료형 변환을 시켜준 뒤, 리턴 값에 담는다.
(만약 처음 숫자 다음 연산이 - 라면 처음 숫자만 담길 것이고, 처음 숫자 다음이 + 라면 - 연산이 나올 때 까지 담는다.
즉, 문제가 처음 수는 양수 조건이기 때문에 무조건 담긴다. 이후 - 인지 +인지는 다음 for문을 돌아 검색한다.)
ex) 55+50-40+35 일 때, 55+50을 연산하고 리턴하여 min 변수에 담는다.
3. for문으로 들어올 때 str배열의 1번 인덱스 이후의 길이까지 반복한다. 0번 인덱스는 2번에서 처리를 했기 때문이다.
str 배열에 +가 아직 남아 있다면, 다시 sum() 함수를 실행하여 나머지 연산도 처리 한다.
만약, +가 없고 - 연산이 연속된다면 sum()함수는 2번 설명과 같이 처음 숫자를 무조건 담고 리턴하기 때문에
min 변수에서 계속 그 리턴 값을 -하면서 처리를 할 것이다.
ex) 55+50-40-35 일 때, 55+50 처리하고 리턴 후 다시 40을 담고 리턴, 다시 35를 담고 리턴 하는 식이 되는 것이다.
그럼 min은 (55+50)-40-35 식을 진행한다. (무조건 +계산이 먼저 되어야 하기 때문)
ex) 55+50-40-35+30 일 때, (55+50) - 40 을 처리하면 min은 65가 남는다.
이 후 (35+30) - 65를 계산하게 되는 것이다.
(55+50) - 40 - (35+30) 계산식이 될 것이다.
'👨💻Programming > 알고리즘 풀이' 카테고리의 다른 글
면접 문제 - 코딩 테스트 (0) | 2021.02.23 |
---|---|
백준 문제 풀이 - greedy - 11399.ATM (0) | 2021.02.20 |
백준 문제 풀이 - greedy - 2839.설탕 배달 (0) | 2021.02.20 |
java - DashInsert 함수 - 짝수 홀수 뒤에 연속적이게 되면 문자 넣기 (0) | 2020.11.22 |
java - 알고리즘 - PrintingOXs - 비트 연산 - 버전 비교 (0) | 2020.11.22 |
댓글