sm 기술 블로그

149. 1541(잃어버린 괄호) - 자바 본문

문제/백준_자바

149. 1541(잃어버린 괄호) - 자바

sm_hope 2022. 7. 18. 19:53
import java.util.*;
import java.io.*;

class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String N = br.readLine();
		int result = 0;

		N = N.replace("-", " ");
		String[] sbits = N.split(" ");

		for (int i = 0; i < sbits.length; i++) {
			if (sbits[i].indexOf("+") != -1) {
				String tmp = sbits[i].replace("+", " ");
				String[] plusList = tmp.split(" ");
				int plusSum = 0;

				for (int j = 0; j < plusList.length; j++) {
					plusSum += Integer.parseInt(plusList[j]);
				}
				sbits[i] = Integer.toString(plusSum);
			}
		}

		if (sbits.length > 1) {
			result = Integer.parseInt(sbits[0]);
			for (int i = 1; i < sbits.length; i++) {
				result -= Integer.parseInt(sbits[i]);
			}
		}
		
		else {
			result = Integer.parseInt(sbits[0]);
		}
		
		System.out.println(result);

	}
}

문제요약

괄호를 제외하고 +와 -만 가진 연산자가 있다. 적절히 먼저 계산해야할 곳을 찾아 이를 최소로 만들 수 있게 해라.

설명

계산을 무조건 +연산자 부터 실행하면 최소로 만들 수 있다.

다음과 같다고 볼 수 있다.

		N = N.replace("-", " ");
		String[] sbits = N.split(" ");

먼저 -연산자를 공백으로 바꿔준다.

+연산자부터 계산을 하기 위함이다.

만약 입력이 위에처럼 55-50+40이 들어온다면 sbits에는 ["55", "50+40"] 이 들어간다.

 

+연산
		for (int i = 0; i < sbits.length; i++) {
			if (sbits[i].indexOf("+") != -1) {
				String tmp = sbits[i].replace("+", " ");
				String[] plusList = tmp.split(" ");
				int plusSum = 0;

				for (int j = 0; j < plusList.length; j++) {
					plusSum += Integer.parseInt(plusList[j]);
				}
				sbits[i] = Integer.toString(plusSum);
			}
		}

1. +연산이 있는지 확인

if (sbits[i].indexOf("+") != -1)

sbits 각 값들이 +를 가지고 있는지 확인한다.

["55", "50+40"]에서 55는 +연산이 없어 -1로 if문 조건을 만족하지 못한다.

50+40은 -1이 아니기 때문에 조건을 만족한다.

 

2. +연산이 있는 부분 계산준비

				String tmp = sbits[i].replace("+", " ");
				String[] plusList = tmp.split(" ");
				int plusSum = 0;

+연산을 공백으로 바꾸고 공백을 기준으로 쪼개서 pluslist에 저장한다.

plusSum은 계산된 값을 저장하기 위해 0으로 초기화 해 주었다.

50+40은 50 40 으로 바뀌고 plusList에 ["50","40"] 으로 저장된다.

 

3. +연산이 있는 부분 계산

				for (int j = 0; j < plusList.length; j++) {
					plusSum += Integer.parseInt(plusList[j]);
				}
				sbits[i] = Integer.toString(plusSum);

plusList에 있는 값을 전부 더 해주고 나온 값을 문자열로 변환하여 sbits[i] 자리에 다시 집어 넣는다.

["50","40"] 을 Integer형으로 변환하여 계산하고 나온 결과값 90을 다시 문자열로 변환해서 sbits[i]에 넣는다.

따라서 sbits는 ["55", "90"] 이라는 값을 가지게 된다.

 

-연산
		if (sbits.length > 1) {
			result = Integer.parseInt(sbits[0]);
			for (int i = 1; i < sbits.length; i++) {
				result -= Integer.parseInt(sbits[i]);
			}
		}
		
		else {
			result = Integer.parseInt(sbits[0]);
		}

sbits안에 값이 하나밖에 없다면 -연산자가 없다는 것이다.

따라서 그 값이 정답이 되고 그 값을 result에 저장한다.

그렇지 않다면, -연산자를 지녔다는 것이다.

0번째 값을 result에 저장하고 뒤에 있는 값을 순차적으로 빼준다.

 

["55", "90"]에서 result에 먼저 55가 저장된다.

그후 55 - 90로 인해 답은 -35가 된다.

'문제 > 백준_자바' 카테고리의 다른 글

151. 10828(스택) - 자바  (0) 2022.07.20
150. 13305(주유소) - 자바  (0) 2022.07.19
148. 11399(ATM) - 자바  (0) 2022.07.18
147. 1931(회의실 배정) - 자바  (0) 2022.07.17
146. 11047(동전 0) - 자바  (0) 2022.07.17
Comments