영원히 흘러가는 강

백준 알고리즘 스택 본문

알고리즘

백준 알고리즘 스택

double_R_one_G 2020. 10. 14. 13:43
728x90

 

10828 스택

 

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다.

 

주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다.

 

문제에 나와있지 않은 명령이 주어지는 경우는 없다.

 

 

 

import java.util.Scanner;
import java.util.Stack;

public class main2 {
	 	
	  public static void main(String[] args) {
	
		  Scanner sc=new Scanner(System.in);
		  int x=Integer.parseInt(sc.nextLine());       //입력 수
		  Stack<Integer> stack = new Stack<Integer>();  //스택
		  System.out.println(" ");
		 
		  
		  for(int i=0;i<x;i++) {
			 String result=sc.nextLine();
			 String k=result.split(" ")[0];                //result 값에 빈칸을 기준으로 잡음
			 
			if(k.equals("push")) {
				stack.push(Integer.parseInt(result.split(" ")[1]));  //빈칸 이후의 값
				}
			else if(k.equals("top")) {
				System.out.println(stack.isEmpty()?-1:stack.peek());
			}
		    else if(k.equals("pop")) {
		    	System.out.println(stack.isEmpty()?-1:stack.pop());
		    	}
		    else if(k.equals("size")) {
		    	System.out.println(stack.size());
		    }
		    else if(k.equals("empty")) {
		    	System.out.println(stack.isEmpty()?1:0);
		    }
	     }
	  }
}

 

개선이 필요! 시간초과..

 

 

 

 

 

 

10773번 제로

 

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)

 

이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.

 

정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.

 

 

import java.util.Scanner;
import java.util.Stack;

public class main2 {
	 	
	  public static void main(String[] args) {
	
		  Scanner sc=new Scanner(System.in);
		  int x=sc.nextInt();              //입력 수
		  int sum=0;
		  Stack<Integer> stack = new Stack<Integer>();  //스택
		  
		  for(int i=0;i<x;i++) {
			  int n=sc.nextInt();
			  if(n==0) {                  //0 입력시
				  stack.pop();            //스택의 값 pop
			  }
			  else{
				  stack.push(n);           //0이 아닐시 stack 에 push
			  }
		  }
		  
		 for(int i:stack) {
			 sum=sum+i;
		 }
		 System.out.println(sum);
	}
	  }

 

 

 

 

 

 

9012 괄호 * 코테에서 나와서 봤었던 지문

 

( 와 ) 로 이루어져 있는 문자열. 올바른 괄호식이 되도록!

 

 

import java.util.Scanner;
import java.util.Stack;

public class main2 {
	 	
	  public static void main(String[] args) {
		 
		  Scanner sc=new Scanner(System.in);
		  int x=sc.nextInt();
		  System.out.println("");
		  for(int i=0;i<x;i++) {
			  String str=sc.next();
			  String[] arr=str.split("");
			  int sum=0;
			  for(int j=0;j<arr.length;j++) {
				  if(arr[j].equals("(")) {             // ( 나오면 수 증가
					  sum=sum+1;
				  }else if(arr[j].equals(")")) {       // ) 수 감소
						  sum=sum-1;
				  }
				  if(sum<0) {
					  System.out.println("no");         //만약 -가 된다면 올바른 수식x
					  break;
				  }
				  }
			  if(sum==0) 
				  System.out.println("yes");            
			  else if(sum>0)
				  System.out.println("no");
		  }

	  }
}

 

휴먼 에러;;; 

 

 

 

 

4949 균형잡힌 세상

 

위의 문제에서 더 나아가 [ ] 추가

import java.util.Scanner;

public class main2 {
	 	
	  public static void main(String[] args) {
		 
		  Scanner sc=new Scanner(System.in);
		
		  while(true) {
			  String str=sc.nextLine();
			  String[] arr=str.split("");
			  int sum=0;
			  int gsum=0;
			  if(arr[0]==".") {
				  System.out.println("yes");
				  break;
			  }
			  
			  for(int j=0;j<arr.length;j++) {
				  if(arr[j].equals("(")) {
					  sum=sum+1;
				  }else if(arr[j].equals(")")) {
						  sum=sum-1;
				  }
				  if(arr[j].equals("[")) {
					  gsum=gsum+1;
				  }
				  else if(arr[j].equals("]")) {
					  gsum=gsum-1;
				  }
				  if(sum<0) {
					  System.out.println("no");
					  break;
				  }
				  if(gsum<0) {
					  System.out.println("no");
					  break;
				  }
				  }
			  if(sum==0 && gsum==0) 
				  System.out.println("yes");
			  else if(sum==0 || gsum==0)
				  System.out.println("no");
		  }
	  }
}

실패...

728x90

'알고리즘' 카테고리의 다른 글

백준 알고리즘 그리디  (0) 2020.10.19
알고리즘에 자주 사용되는  (0) 2020.10.19
백준 알고리즘 브루트 포스  (0) 2020.10.08
백준 알고리즘 재귀  (0) 2020.10.08
백준 알고리즘  (0) 2020.10.07
Comments