본문 바로가기

알고리즘/백준

[BOJ 10799] 쇠막대기(Java, Replace, 직관적인 풀이)

https://www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저�

www.acmicpc.net

 

 

1. 우선, 문자별로 처리를 하기 위해서 "()"을 모두 replace한다.

 * 함수를 쓸 때, str.replaceAll("()", "r")을 하면 안되고, '('와 ')'은 모두 escape 문자이므로 앞에 '\\'을 붙여줘야 한다.

 

 

 

2. 레이저 포인트를 쐈을 때, 레이저 이전의 막대의 개수를 파악하고 모두 더한 후에 마지막 막대의 개수만 더해준다.

 * 막대의 개수를 파악하기 위해서, cur과 end라는 변수를 사용한다. 문제의 예제를 보면서 코드를 작성하면 쉽게 해결할 수 있다. 

 

 

 


해설코드(Java).

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
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Main
{
    static BufferedReader br;
    static String str;
    static int result = 0;
    
    public static void main (String[] args) throws java.lang.Exception
    {
        br = new BufferedReader(new InputStreamReader(System.in));
        str = br.readLine();
        str = str.replaceAll("\\(\\)""r");
        
        int cnt = 0;
        int end = 0;
        
        for(int i = 0; i < str.length(); i++){
            char c = str.charAt(i);
            if(c == '('){
                cnt += 1;
            }else if(c == ')'){
                end += 1;
                if(cnt >= 1) cnt -= 1;
            }else if(c == 'r'){
                result += (cnt + end);
                end = 0;
            }
        }
        result += end;
        
        System.out.println(result);
    }
}