본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)18258번, 큐 2

by 열정적인 이찬형 2022. 2. 13.

문제 링크

18258번: 큐 2
 
www.acmicpc.net

주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

기본적으로 큐는 FIFO(선입선출)의 자료구조를 가지고 있습니다.

FIFO는 먼저 들어간 데이터들이 출력할 때 먼저 나온다는 이야기입니다.

예를 들어 3, 2, 1을 순서대로 큐에 저장한 뒤 하나씩 꺼내보겠습니다.

1. 3을 큐에 넣었을 때

3    

2. 2을 큐에 넣었을 때

3 2  

3. 1을 큐에 넣었을 때

3 2 1

4. 큐에 하나의 자료를 출력하라는 명령이 떨어졌을 때

3 2 1

5. 다시 자료를 출력하라는 명령이 떨어졌을 때

  2 1

위에 표를 보면 가장 먼저 저장된 데이터가 먼저 출력되는 것을 볼 수 있듯이 큐는 FIFO형태의 자료구조입니다.

Java에서 큐를 표현하려면 LinkList<>()로 선언해주어야 하므로 큐를 선언해주었습니다.

문제에서는 push, pop, size, empty, front, back을 구현하도록 했기 때문에 각각의 기능을 함수로 구현하였습니다.

push : Queue.offer이나 Queue.add 를 사용하여 구현하였습니다.

pop : Queue.poll을 사용하여 구현하였습니다.

size : Queue.size을 사용하여 구현하였습니다.

empty : Queue.isEmpty을 사용하여 구현하였습니다.

front : Queue.peek을 사용하여 구현하였습니다.

back : 따로 명령어가 존재하지 않기 때문에 push을 진행할때마다 변수에 저장하여 변수에 내용을 사용하여 구현하였습니다.

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • StringTokenizer를 통해서 명령어와 값을 띄어쓰기 기준으로 나누었습니다.
  • if문을 통해서 명령어에 해당하는 함수를 실행하도록 하였습니다.
  • push/pop/size/empty/front/back 함수를 만들었습니다.
  • StringBuilder에 저장된 결과값을 System.out.println을 사용하여 출력하였습니다.
  • push/pop/size/empty/front/back 함수들은 모두  위에서 설명한 내용 그대로 구현하였습니다.

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static int size,last = 0;	//명령개수, 마지막 저장 값
	static Queue<Integer> queue = new LinkedList<Integer>();	//사용할 큐
	static StringBuilder sb = new StringBuilder();	//결과
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //BufferedReader를 통해 입력 값 받기
        //--------입력값 저장 및 함수 실행------
    	size = Integer.parseInt(br.readLine());
    	StringTokenizer st;
    	for(int i=0;i<size;i++) {
    		st = new StringTokenizer(br.readLine()," ");
    		String text = st.nextToken();
    		if(text.equals("push")) {
    			int temp = Integer.parseInt(st.nextToken());
    			push(temp);
    		}
            else if(text.equals("pop"))
    			pop();
    		else if(text.equals("size"))
    			size();
    		else if(text.equals("empty"))
    			empty();
    		else if(text.equals("front"))
    			front();
    		else if(text.equals("back"))
    			back();
    	}
    	System.out.println(sb.toString());	//결과 출력
    	br.close();
	}
    	//push 함수
	public static void push(int n) {
		queue.offer(n);
		last = n;
	}
    	//pop 함수
	public static void pop() {
		if(queue.isEmpty())
			sb.append("-1\n");
		else {
			int temp = queue.poll();
			sb.append(temp + "\n");
		}
	}
    	//size 함수
	public static void size() {
		sb.append(queue.size() + "\n");
	}
    	//empty 함수
	public static void empty() {
		if(queue.isEmpty()) {
			sb.append("1\n");
		}
		else {
			sb.append("0\n");
		}
	}
        //front 함수
	public static void front() {
		if(queue.isEmpty())
			sb.append("-1\n");
		else
			sb.append(queue.peek() + "\n");
	}
    	//back 함수
	public static void back() {
		if(queue.isEmpty())
			sb.append("-1\n");
		else
			sb.append(last + "\n");
	}
}

댓글