본문 바로가기
백준

[백준] code.plus(큐와 그래프,JAVA)10845번, 큐

by 열정적인 이찬형 2022. 4. 20.

문제 링크


주의사항

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

문제 설명


접근 방법

큐는 FIFO(선입선출)의 형태를 가지고 있는 자료 구조입니다.자세한 내용은 아래에 링크를 통해 확인해주시면 감사하겠습니다.

 

큐 (자료 구조) - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

만약 큐에 값을 넣었을 때와 삭제할 때를 표를 통해 보여드리자면

1. 3을 큐에 넣었을 때

3

2. 2을 큐에 넣었을 때

2 3

3. 1을 큐에 넣었을 때

1 2 3

4. 큐에서는 자료를 출력할 때에는 FIFO로 처음 저장된 값부터 출력됩니다.

출력을 진행하면

1 2

처음 저장되었던 3이 큐에서 빠져나옵니다.

 

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

 

문제에서는 push x, pop, size, empty, front, back을 구현하도록 되어있습니다.

push x : 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 진행하였습니다.
  • BufferedWriter에 명령어 실행마다 결과를 저장하였습니다.
  • BufferedWriter에 저장된 결과를 모두 출력하였습니다.

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static int N;		//명령어 개수 저장 변수
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력값 처리하는 BufferedReader
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과값 출력하는 BufferedWriter
    	Queue<Integer> queue = new LinkedList<Integer>();	//사용할 Queue
    	StringTokenizer st;
    	N = Integer.parseInt(br.readLine());
    	int bottomValue = 0;	//가장 뒤에 있는 값 초기화
    	for(int i=0;i<N;i++) {
    		String command = br.readLine();		//명령어 읽기
    		if(command.equals("pop")) {			//pop
    			if(queue.isEmpty())
    				bw.write("-1\n");
    			else
    				bw.write(queue.poll() + "\n");
    		}else if(command.equals("size"))	//size
    			bw.write(queue.size() + "\n");
    		else if(command.equals("empty"))	//empty
    			bw.write((queue.isEmpty()?1:0) + "\n");
    		else if(command.equals("front")) {	//front
    			bw.write((queue.isEmpty()?-1:queue.peek()) + "\n");
    		}else if(command.equals("back")) {	//back
    			bw.write((queue.isEmpty()?-1:bottomValue) + "\n");
    		}else {		//push
    			st = new StringTokenizer(command," ");
    			String temp = st.nextToken();
    			int num = Integer.parseInt(st.nextToken());
    			bottomValue = num;		//가장 뒷 값 변경
    			queue.add(num);
    		}		
    	}
    	bw.flush();		//저장된 명령어 결과 출력
    	bw.close();
    	br.close();
    }
}

댓글