본문 바로가기
알고리즘/백준

백준 10799번 - 쇠막대 (Java 8)

by latissimus 2022. 3. 12.

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

 

10799번: 쇠막대기

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

www.acmicpc.net

스택 활용 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        Stack<Character> stack = new Stack<>();
        int sumOfChop = 0;


        for (int i = 0; i < input.length(); i++) {
            //여는 괄호일 때
            if(input.charAt(i) == '('){
                stack.push('(');
                continue; // 할 일 다했으니 continue
            }

            //닫는 괄호일 때
            if(input.charAt(i) == ')'){
                stack.pop();
                // 1)레이저인 경우, 2)막대가 끊기는 경우
                if(input.charAt(i-1) == '('){
                    sumOfChop += stack.size();
                } else{
                    sumOfChop++;
                }
            }
        }
        System.out.println(sumOfChop);
    }
}

2시간은 고민했다. 처음에 "잘린 막대의 총 개수 = 레이저와 막대의 접점 수 + 끊긴 지점 수 + 막대를 쌓은 층수" 이런식으로 풀려고 했다. 코드를 3배 길이는 쓰고 5번은 틀렸다. 알고보니 훨씬 더 간단한 방법이 있었다.

 

제이온님 블로그 백준 10799번

막대가 끊길때마다 +1을 해줄 생각을 못했다. 레이저 체크를 이전 인덱스를 확인하는 것으로 깔끔하게 나타냈다. 갈길이 멀다.

 

 

댓글