곽로그

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

알고리즘/백준

[백준 10799, Java] 쇠막대기

일도이동 2020. 10. 28. 20:53
반응형

문제

www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

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

www.acmicpc.net

check

1. 천천히 꾸준히

2020년 1월에 푼 쇠막대기를 보니 이 문제를 왜 어려워했나 하는 생각이 든다. 천천히 꾸준히 하다보면 지금 어려워 하는 문제도 언젠간 쉬워지겠지

 

2. 구분

 같은 괄호라도 상황에 따라 역할이 다르다. )의 경우 바로 앞 괄호가 (이면 레이저이고 아닌 경우 나무의 끝이다. )의 두가지 상태에 따라 구현을 다르게 하면 된다. 

 

3. 다시풀기

 종종 예전에 풀었던 문제를 다시 풀어야겠다. 얼만큼 성장했는지 눈에보이니 그래도 보람이 있다. 

 

4. 기록하기

 3에서 얼만큼 성장했는지를 보려면 지금 문제를 풀때 어떤 점이 어려웠고 어떻게 접근했는지를 자세히 기록해 놔야겠다. 

 

 

코드

1. 스택사용

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String line = br.readLine().trim();

        int pieceCount = 0;
        Stack<Character> stack = new Stack<>();
        for(int index = 0 ; index<line.length(); index++){
            char bracket = line.charAt(index);
            if(bracket=='('){
                stack.push('(');
            }
            else{
                if(line.charAt(index-1)=='('){
                    //레이저
                    stack.pop();
                    pieceCount +=stack.size();
                }
                else{
                    //나무의 끝
                    stack.pop();
                    pieceCount+=1;

                }
            }
        }

        bw.write(String.valueOf(pieceCount));
        bw.flush();

    }
}

 

2. 스택 사용하지 않음

- 스택의 용도는 남아있는 (의 갯수를 알기위함이므로 굳이 스택을 사용해서 (의 갯수를 셀 필요는 없다. 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String line = br.readLine().trim();

        int pieceCount = 0;
        int ironCount = 0;
        for(int index = 0 ; index<line.length(); index++){
            char bracket = line.charAt(index);
            if(bracket=='('){
                ++ironCount;
            }
            else{
                if(line.charAt(index-1)=='('){
                    //레이저
                    --ironCount;
                    pieceCount +=ironCount;
                }
                else{
                    //나무의 끝
                    --ironCount;
                    pieceCount+=1;

                }
            }
        }

        bw.write(String.valueOf(pieceCount));
        bw.flush();

    }
}


반응형

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

[백준 1929, Java] 소수구하기  (0) 2020.11.02
[백준 17298, Java] 오큰수  (0) 2020.10.31
[백준 17413, Java] 단어 뒤집기2  (0) 2020.10.28
[백준 1406, Java] 에디터  (0) 2020.10.28
[백준 10820, Java] 문자열 분석  (0) 2020.10.27
Comments