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

 

10799번: 쇠막대기

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

www.acmicpc.net

분석

  • 레이저는 반드시 인접한 () 쌍으로 표현
  • 나머지 떨어진 괄호`()`가 쇠막대기로 표현됨
  • 잘려진 쇠막대기는 총 몇조각인가? 를 구하는 문제

접근

  • 스택으로 하는게 좋을 것 같음
  • ( 나오면 스택에 넣고
  • ) 나오면 pop() 하고 스택 사이즈 만큼 더해주면 될 것 같음
  • 예시 시뮬레이션을 돌려보니 3 + 3 + 2 + 3 + 2 + 2 + 1 + 1 = 17 맞음

오류

  • 두번째 예시 틀렸음
  • )로 레이저 말고 쇠막대기를 닫을때는 stack size 만큼이 아니라 +1 해주면 된다
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 parentheses = br.readLine();
        Stack<Character> stack = new Stack<>();
        int count = 0;
        char prev = '(';
        for (char c : parentheses.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            }
            if (c == ')') {
                if (prev == '(') {
                    stack.pop();
                    count += stack.size();
                } else {
                    count++;
                    stack.pop();
                }
            }
            prev = c;
        }

        System.out.println(count);
    }
}

 

회고

  • if 문을 왜 나열했을까? -> else if()를 사용해서 하나만 체크하고 넘어가는 식으로 만드는 것이 오류를 줄일 수 있을 것 같다
  • stack.pop()이 공통으로 중복되므로 하나로 빼서 중복을 줄여줄 수 있었다

'알고리즘 > 자료구조' 카테고리의 다른 글

[백준] 10828 스택 - 자바  (0) 2022.02.01

+ Recent posts