μ½”λ”© ν…ŒμŠ€νŠΈ/λ°±μ€€ μ•Œκ³ λ¦¬μ¦˜

[ λ°±μ€€ μ•Œκ³ λ¦¬μ¦˜ / java ] 10828 - μŠ€νƒ (1)

Forest Yun 2021. 6. 24. 23:37
728x90

 

μŠ€νƒ μ‹€νŒ¨

μ‹œκ°„ μ œν•œ: 0.5 초 (μΆ”κ°€ μ‹œκ°„ μ—†μŒ)

λ©”λͺ¨λ¦¬ μ œν•œ: 256 MB

문제

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ„ κ΅¬ν˜„ν•œ λ‹€μŒ, μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” λͺ…령을 μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λͺ…령은 총 λ‹€μ„― 가지이닀.

  • push X: μ •μˆ˜ Xλ₯Ό μŠ€νƒμ— λ„£λŠ” 연산이닀.
  • pop: μŠ€νƒμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  • size: μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  • empty: μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  • top: μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

μž…λ ₯

첫째 쀄에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ 수 N (1 ≤ N ≤ 10,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆμ§€ μ•Šμ€ λͺ…령이 μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†λ‹€.

좜λ ₯

좜λ ₯ν•΄μ•Όν•˜λŠ” λͺ…령이 μ£Όμ–΄μ§ˆ λ•Œλ§ˆλ‹€, ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

 

 

import java.util.Scanner;

//2021.06.21 10828번: μŠ€νƒ
//μ‹œκ°„ 초과 (μ‹œκ°„μ œν•œ 0.5초) -> λΉ λ₯Έ μž…μΆœλ ₯ κ³΅λΆ€ν•˜κΈ°!! 15552 번 문제 μ°Έκ³ 

public class baekjoon10828 {

	public static class linkedStack{
		private class Node{
			int data;
			Node link;
		}

		private Node top=null;
		private int count=0;

		// push X: μ •μˆ˜ Xλ₯Ό μŠ€νƒμ— λ„£λŠ” 연산이닀.
		public void push(int item) {//topκ³Ό newNode 가지고 ν•˜κΈ°
			Node newNode=new Node();
			newNode.data=item;
			newNode.link=top;
			top=newNode;
			count++;
		}

		//pop: μŠ€νƒμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. 
        //λ§Œμ•½ μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
		public int pop() {//top만 가지고 ν•˜κΈ°
			int data;

			if(isEmpty()==0) {
				data=top.data;
				top=top.link;
				count--;
			}
			else
				data=-1;

			return data;
		}

		//empty: μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
		public int isEmpty() {
			if(top==null)//λΉ„μ–΄μžˆμœΌλ©΄
				return 1;
			return 0;
		}

		//size: μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
		public int getSize() {
			return count;
		}

		//top: μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. 
        //λ§Œμ•½ μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
		public int getTop(){
			if(isEmpty()==1)
				return -1;
			return top.data;	
		}
	}

	//ν”„λ‘œκ·Έλž¨ μ‹€ν–‰
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		linkedStack stack=new linkedStack();

		int instructionNum;
		instructionNum=scanner.nextInt();

		for(int i=0; i<instructionNum;i++) {
			String instruction=scanner.next();

			switch(instruction){
			case "push": 
				int item=scanner.nextInt();
				stack.push(item);
				break;
			case "pop":
				System.out.println(stack.pop());
				break;
			case "size":
				System.out.println(stack.getSize());
				break;
			case "empty":
				System.out.println(stack.isEmpty());
				break;
			case "top":
				System.out.println(stack.getTop());
				break;
			}
		}

		scanner.close();
	}
}

 

  • μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒ κ΅¬ν˜„: μ—°κ²° 자료ꡬ쑰λ₯Ό μ΄μš©ν•œ μŠ€νƒ κ΅¬ν˜„ 
  • static 클래슀둜 μŠ€νƒ κ΅¬ν˜„
  • switch문을 μ‚¬μš©ν•˜μ—¬ μž…λ ₯받은 λ¬Έμžμ—΄λ³„ 각 λ©”μ†Œλ“œ 호좜
  • ν‹€λ¦° λΆ€λΆ„: μ‹œκ°„ 초과

 

 

 




 

 

 

 

1. μŠ€νƒ (stack)

  • μ ‘μ‹œλ₯Ό μŒ“λ“―μ΄ 자료λ₯Ό 차곑차곑 μŒ“μ•„μ˜¬λ¦° ν˜•νƒœμ˜ 자료ꡬ쑰
  • ν›„μž…μ„ μΆœ ꡬ쑰(LIFO: Last-In First-out) → top μ—μ„œλ§Œ μ €μž₯된 μ›μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
  • top : μŠ€νƒμ˜ κ°€μž₯ μœ„μ— 놓인 μ›μ†Œλ₯Ό 가리킨닀. 
  • μŠ€νƒμ˜ μ—°μ‚°:
    • push(s, item) : μ‚½μž…, μŠ€νƒ s에 item(μ›μ†Œ)을 μ‚½μž…ν•˜λŠ” μ—°μ‚°
    • pop(s) : μ‚­μ œ, μŠ€νƒ s의 top에 μžˆλŠ” μ›μ†Œλ₯Ό μ‚­μ œν•˜μ—¬ λ¦¬ν„΄ν•˜λŠ” μ—°μ‚°
    • + μΆ”κ°€ μ—°μ‚° - peek(s) : μŠ€νƒ s의 top에 μžˆλŠ” μ›μ†Œλ₯Ό μ‚­μ œν•˜μ§€ μ•Šκ³  λ¦¬ν„΄ν•˜λŠ” μ—°μ‚°
  • μŠ€νƒμ˜ κ΅¬ν˜„:
    • 순차 자료ꡬ쑰 - 1차원 배열을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„. 단점) 곡간 λ‚­λΉ„ κ°€λŠ₯μ„± λ†’μŒ, 크기 λ³€κ²½ λΉ„νš¨μœ¨μ 
    • μ—°κ²° 자료ꡬ쑰 - λ‹¨μˆœ μ—°κ²° 리슀트λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„. μŠ€νƒμ˜ μ›μ†Œ ν•˜λ‚˜ = λ…Έλ“œ ν•˜λ‚˜

 

 

 


 

 

1.1 μŠ€νƒμ˜ κ΅¬ν˜„ - μ—°κ²° 자료ꡬ쑰

  • λ‹¨μˆœ μ—°κ²° 리슀트λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„
    • μŠ€νƒ μ›μ†Œ ν•˜λ‚˜ = λ‹¨μˆœ μ—°κ²° 리슀트의 λ…ΈνŠΈ ν•˜λ‚˜
  • 순차 자료ꡬ쑰의 단점 극볡 κ°€λŠ₯ 
  • λ³€μˆ˜ top :  λ‹¨μˆœ μ—°κ²° 리슀트의 첫번째 λ…Έλ“œ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜
    • empty μƒνƒœ : top == null (μ΄ˆκΈ°μƒνƒœ)
    • full μƒνƒœ : μ •μ˜λ˜μ§€ μ•ŠμŒ
  • μ—°κ²° 자료ꡬ쑰λ₯Ό μ΄μš©ν•œ μŠ€νƒ μ—°μ‚°
    • push(s, item) : λ‹¨μˆœ μ—°κ²° 리슀트 μŠ€νƒ s의 κ°€μž₯ μ•žμ— data κ°’μœΌλ‘œ item을 가진 λ…Έλ“œ μ‚½μž…. <μ†Œμš”μ‹œκ°„ O(1)>
    • pop(s) : λ‹¨μˆœ μ—°κ²° 리슀트 μŠ€νƒ s의 첫번째 λ…Έλ“œ μ‚­μ œ. 즉, top이 가리킀고 μžˆλŠ” λ…Έλ“œ μ‚­μ œ ν›„ 리턴

 

public class MyLinkedStack {
	private Node top =null //곡백 μŠ€νƒ 생성
    
    private class Node{//Node클래슀
    	char data;
        Node link
    }
    
    public boolean isEmpty(){
    if(top == null)  //empty μƒνƒœ : top == null
    	return true;
    else
    	return false;
    }
    
    public void push(char item){//topκ³Ό item만 μ΄μš©ν•˜μ—¬ μŠ€νƒμ— μ‚½μž…
    	Node newNode= new Node();//μ‚½μž…ν•  itemλ₯Ό μ €μž₯ν•  μƒˆ λ…Έλ“œ 생성
    	newNode.data=item; //μƒˆ λ…Έλ“œμ˜ data에 item μ €μž₯
        newNode.link=top;
        /*
        λ§Œμ•½ 곡백 μŠ€νƒμΌ 경우 top은 null, 
        μƒˆ λ…Έλ“œλŠ” ν•΄λ‹Ή μŠ€νƒμ˜ 첫번째 λ…Έλ“œμ΄μž λ§ˆμ§€λ§‰ λ…Έλ“œμ΄λ―€λ‘œ link에 null μ €μž₯ν•΄μ•Ό 함
        
        곡백 μŠ€νƒμ΄ 아닐 경우 top은 이전 λ…Έλ“œλ₯Ό 가리킴
        μƒˆ λ…Έλ“œλŠ”  이전 λ…Έλ“œλ₯Ό κ°€λ¦¬μΌœμ•Ό ν•˜λ―€λ‘œ top, 
        즉 이전 λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” linkλ₯Ό λ°›μ•„ 이전 λ…Έλ“œλ₯Ό 가리킨닀.
        */
        top=newNode; //top이 μƒˆ λ…Έλ“œ, 즉 첫번째 λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•œλ‹€.
    }
    
    public char pop(){ //top을 μ‚¬μš©ν•˜μ—¬ μ‚­μ œ ν›„ 리턴
    	if(isEmpty())
        	μ˜ˆμ™Έ λ°œμƒ;
        else{
        	char item=top.data; //top이 κ°€λ¦¬ν‚€λŠ” λ…Έλ“œμ˜ dataλ₯Ό λ”°λ‘œ μ €μž₯ν•œλ‹€.
            top=top.link; //top이 첫번째 λ…Έλ“œμ˜ link, 즉 λ‘λ²ˆμ§Έ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•œλ‹€.
            //μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ λ…Έλ“œλŠ” λ‹€λ₯Έ λ…Έλ“œμ™€μ˜ 연결이 λŠμ–΄μ§€λ©΄ ν•΄λ‹Ή λ…Έλ“œλŠ” μ‚­μ œλœλ‹€.
            return item;
        }
    }
}

 

 




 

 

 

곡뢀 자료
μžλ°”λ‘œ λ°°μš°λŠ” μ‰¬μš΄ 자료ꡬ쑰, 전곡 μˆ˜μ—…
728x90