230104 TIL : 스택 + 백준 4949번

won·2023년 1월 4일
0

알고리즘 문제풀이

목록 보기
1/32

TIL

알고리즘 스터디에 들어갔고, 자료구조 공부를 하기 시작했다.
오늘은 스택부터

자바를 주 언어로 하기 때문에 Stack 클래스를 썼다.

스택(Stack)

줄을 지어 마지막에 들어온 데이터를 먼저 처리하는 구조를 가지고 있는 자료구조.
이러한 구조를 후입 선출(LIFO:Last-In First-Out)이라고 한다.

스택의 입출력이 이루어지는 부분을 스택 상단(stack top)이라 하고
반대쪽인 하단 부분을 스택 하단(stack bottom)이라고 한다.
스택에 저장되는 것을 요소(element)라고 한다.
요소가 하나도 없는 비어있는 스택을 공백 스택(empty stack)이라고 한다.

스택 클래스(JAVA)

import java.util.stack //import문

Stack<자료형> stack= new Stack<>();

으로 선언한다.
import문 필수.

stack.add(1); //스택에 1 추가
stack.pop(); //가장 나중에 들어온 요소 빼기 (1)
stack.push(2); //스택에 2추가
stack.peek(); //스택 상단의 요소를 반환한다.(2)
stack.search(2) // 스택에서 2가 있는 인덱스 위치를 반환한다.

백준 4949번: 균형잡힌 세상

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

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

public class valanced_world_4949 {
	public static void main(String[] args) throws IOException {
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
		
		Stack<Character> stack=new Stack<Character>();
		
	
		while(true) {
			String str= br.readLine();
			if(str.charAt(0)=='.') 
            	break;
			char[] arr = str.toCharArray();

			for (int j = 0; j < arr.length; j++) {
				if (arr[j] == '(' || arr[j]=='[') {
					stack.push(arr[j]);
					
				} else if(arr[j]==')'){
					if(stack.empty()) {
						stack.push(arr[j]);
						break;
					}else if(stack.peek()=='('){
						stack.pop();
					}else {
						stack.push(arr[j]);
					}
				}else if(arr[j]==']') {
					if(stack.empty()) {
						stack.push(arr[j]);
						break;
					}else if(stack.peek()=='['){
						stack.pop();
					}else {
						stack.push(arr[j]);
					}
				}
			}
			
			if(stack.empty()) {
				bw.write("yes\n");
			}else {
				bw.write("no\n");
			}
			
			stack.clear();
		}
		bw.flush();
		bw.close();
		br.close();
	}
}

스택과 if-else 문을 적절히 잘 사용하면 쉽게 풀 수 있는 문제였다.

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

public class valanced_world_4949 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		Stack<Character> stack = new Stack<Character>();

		while (true) {
			String str = br.readLine();
			if (str.charAt(0) == '.')
				break;
			char[] arr = str.toCharArray();

			for (int j = 0; j < arr.length; j++) {
				if (arr[j] == '(' || arr[j] == '[') {
					stack.push(arr[j]);
				} else if (arr[j] == ')' && !stack.isEmpty() && stack.peek() == '(') {
					stack.pop();
				} else if (arr[j] == ']' && !stack.isEmpty() && stack.peek() == '[') {
					stack.pop();
				}	else if (arr[j] == ']' || arr[j] == ')'){
					stack.push(arr[j]);
					break;
				}
			}

			if (stack.empty()) {
				bw.write("yes\n");
			} else {
				bw.write("no\n");
			}

			stack.clear();
		}
		bw.flush();
		bw.close();
		br.close();
	}
}

조금 더 깔끔하게 코드를 수정해보았음.

profile
뭐라도 하자

0개의 댓글