레벨업 일지

[Java] 백준 10799 쇠막대기 본문

알고리즘/백준

[Java] 백준 10799 쇠막대기

24시간이모자란 2023. 6. 29. 04:29

문제

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

 

10799번: 쇠막대기

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

www.acmicpc.net

풀이

문제가 '(' 와 ')' 기호 의 콤비내이션으로 이루어져있어 스택 알고리즘 으로 접근하는게 편하다 생각들었다.

 

문제를 해석하면  () 는 레이저 광선을 의미하고  (( .. )) 처럼 열림-닫힘 쌍이 아닌 것들은 쇠 막대기이다.

따라서 레이저가 한번 지잉 하면, 쇠막대기 개수만큼 정답 변수에 누적합을 하면 된다.

 

풀이 알고리즘은 다음과 같다.

  1. 현재 기호가 ( 이면 stack +1 .
  2. 현재 기호가 ) 이면 stack -=1  적용하고 다음과 같다.
    1. 현재 인덱스 i 에서 i-1 번째가 ( 기호이면 쇠막대기 만큼 더한다. 
    2. 현재 인덱스 i 에서 i-1번째가 ) 기호이면, 쇠막대기가 감소하는 것임으로 +1 을 한다.
  3. 정답을 리턴한다.

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    BufferedWriter bw;

    public static void main(String args[]) throws IOException {
        Main m = new Main();
        m.solution();
    }
    public void solution() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = br.readLine();
        int stack =0;
        int ans =0;
        char[] charArr = str.toCharArray();
        for(int i =0  ;i < charArr.length; i++){
            if(charArr[i] == '(')
                stack++;
            else if(charArr[i] == ')'){
                stack--;
                if(charArr[i-1] == '('){
                    ans +=stack;
                }else{
                    ans ++;
                }
            }
        }
        bw.write(Integer.toString(ans));

        bw.close();
    }

}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 17829 222-풀링  (0) 2023.07.04
[Java] 백준 16935 배열 돌리기 3  (0) 2023.06.29
[Java] 백준 5464.주차장  (0) 2023.06.27
[Java] 백준 1992. 쿼드트리  (0) 2023.06.27
[Java] 백준 2573.빙산  (0) 2023.05.15
Comments