Study/Algorithm

[BOJ] 백준 10799번: 쇠막대기 _자바(JAVA)

delay100 2022. 6. 13. 00:10
728x90
반응형

1. 문제

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

 

 

10799번: 쇠막대기

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

www.acmicpc.net


2. 접근 및 해결

2-1) 접근

알고리즘 분류가 스택인 만큼, 스택을 사용해서 해결했습니다. 그러나 스택을 꼭 사용할 필요는 없습니다!

저는 그래도 스택으로 풀이해봤습니다.

예제1의 예시를 계속 보다보면, 아래의 사진처럼 총 3개의 규칙을 찾을 수 있습니다.

빨간색 박스: 레이저의 닫는 괄호 

 -> 이 곳에 위치할 때마다 count 변수에 스택의 크기를 더해준다.

초록색 밑줄: 레이저가 아니고, 여는 괄호

-> 그저 stack에 push 하면 되어 보인다!

파란색 기둥: 레이저가 아니고, 닫는 괄호

-> stack에 pop하고 count 변수의 크기를 1 늘린다.


2-2) 해결

위의 접근을 생각하고, 스택의 특징을 떠올리며 해결 방안을 찾아나갔습니다.

1. 현재 값이 "("인 경우, 초록색 밑줄

2. 현재 값이 ")"인데,

2-1) 이전 값이 "("인 경우,  빨간색 박스

2-2) 이전 값이 ")"인 경우, 파란색 기둥

 


3. 코드(JAVA) 

package todayStudy;

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

public class n10799 {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		String s = bf.readLine();

		String[] sl = s.split("");
		Stack<String> st = new Stack<String>();
		int count = 0;
		for (int i = 0; i < sl.length; i++) {
			if(sl[i].equals("(")) {
				st.push(sl[i]);
			}
			else if (sl[i].equals(")")) {
				if (sl[i-1].equals("(")) {
					st.pop();
					count+=st.size();
				} else {
					st.pop();
					count++;
				}
			}
		}
		System.out.print(count);
	}
}

 

728x90
반응형