본문 바로가기

CS ﹒ Algorithm/Baekjoon

Java 백준 문제풀이 (60) 1541_잃어버린 괄호

 

자기가 괄호를 지워놓고 왜 잃어버린 괄호야?

아무튼 이런 문제다.

 

이런 간단한 문자열 다루는 문제가 어렵게 느껴질 때가 있어서 종종 풀어보면 좋은 것 같다.

이 문제는 간단한 문제 중에서도 제일 간단한 문제로, substring이나 replace같은 것도 필요 없다.

 

너무 쉬운 문제지만 일단 문제를 보고 주석을 작성해보자.

늘 정리하는 과정을 거치는 것이 빠르게 푸는 지름길이다.

 

 

 

 

1
2
3
4
5
6
7
8
9
    // 양수, +, - 조합의 문장이 입력된다.
    // 식은 '0'~'9', '+', '-'로만 이루어져있다.
 
    // + , - , 괄호를 사용해서 최소값을 만드는 방법?
    // - 이후로 다음 -가 나올 때까지 모두 괄호 안에 넣으면 된다.
    // 10 - (10 + 10 + 10) - 10
 
    // 숫자가 000009 같은 형태로 입력될 수 있음
    // => String을 Integer로 변환 시 자동으로 앞의 0을 제거하므로  문제 없다.
cs

 

나는 이렇게 작성했다.

사실 크게 설명할 게 없다.

 

+ 여러개, - 여러개, 숫자 여러개가 있다면 당연히 최소값을 만들기 위해서는 마이너스 기호 뒤에 있는 수가 커질수록 좋다.

따라서 - 바로 뒤에 오는 수부터, 그 다음 - 전까지의 모든 수를 더해주면 된다.

 

사실 막혀도 여기서 막힐 일은 없을 거고 어떻게 이것을 구현할 것인지 문제 풀이 방식이 생각이 안 날 수 있다.

야매 수도코드를 작성하며 방법을 떠올려보자.

힌트 : -를 기준으로..

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Main {
    // 양수, +, - 조합의 문장이 입력된다.
    // 식은 '0'~'9', '+', '-'로만 이루어져있다.
 
    // + , - , 괄호를 사용해서 최소값을 만드는 방법?
    // - 이후로 다음 -가 나올 때까지 모두 괄호 안에 넣으면 된다.
    // 10 - (10 + 10 + 10) - 10
 
    // 숫자가 000009 같은 형태로 입력될 수 있음
    // => String을 Integer로 변환 시 자동으로 앞의 0을 제거하므로  문제 없다.
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String dd = "dd";
        // 문자열 식 입력 받기.
 
        // 배열 = 문자열 식을 "-"기준으로 나눈다.
 
        // 정답을 저장할 변수 answer 생성
 
        // 반복문 ( i < 배열 길이 )
        // 서브배열 = 배열[i]를 다시 "+"기준으로 나눈다.
        // 임시 변수 생성
        //
        // 반복문 ( j < 서브 배열 크기 )
        // 임시 변수 += 서브배열[j]
        //
        // 만약 answer가 0이라면 += 임시변수
        // 아니라면 -= 임시변수
 
        // 정답 출력
    }
}
cs

 

그렇다. -를 기준으로 나누면 내부는 +만 있을 것이다.

근데 너무 쉬운 문제라서 여기가지만 읽어도 이미 모든 걸 알려준 것이나 다름 없다.

그래서 오늘은 여기서 설명 끝.

 

이 주석대로만 풀면 틀린다.

아주 조금 다듬어야하는 곳이 있다.

 

정답은 아래에.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
    // 양수, +, - 조합의 문장이 입력된다.
    // 식은 '0'~'9', '+', '-'로만 이루어져있다.
 
    // + , - , 괄호를 사용해서 최소값을 만드는 방법?
    // - 이후로 다음 -가 나올 때까지 모두 괄호 안에 넣으면 된다.
    // 10 - (10 + 10 + 10) - 10
 
    // 숫자가 000009 같은 형태로 입력될 수 있음
    // => String을 Integer로 변환 시 자동으로 앞의 0을 제거하므로  문제 없다.
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 문자열 식 입력 받기.
        // 배열 = 문자열 식을 "-"기준으로 나눈다.
        String[] arr = br.readLine().split("-");
 
        // 정답을 저장할 변수 answer 생성
        int answer = 0;
        boolean checkIfAdded = false;
 
        // 반복문 ( i < 배열 길이 )
        for (int i=0; i<arr.length; i++) {
            // 서브배열 = 배열[i]를 다시 "+"기준으로 나눈다.
            String[] subArr = arr[i].split("\\+");
            // 임시 변수 생성
            int temp = 0;
            //
            // 반복문 ( j < 서브 배열 크기 )
            for (int j=0; j< subArr.length; j++) {
                // 임시 변수 += 서브배열[j]
                temp += Integer.parseInt(subArr[j]);
            }
 
            if (!checkIfAdded) {
                answer += temp;
                checkIfAdded = true;
            } else {
                answer -= temp;
            }
            // 만약 answer가 0이라면 += 임시변수
            // 아니라면 -= 임시변수
        }
        // 정답 출력
        System.out.println(answer);
    }
}
cs