본문 바로가기

문제풀기/알고리즘 스터디

[알고리즘] Queue 문제 풀이(백준 10773번, 10828번)

728x90
반응형

1. 큐 2(백준 18258번 문제)

 

18258번: 큐 2 (acmicpc.net)

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

▷ 풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Que2 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());

		int[] arr = new int[n];
		int ft = 0; // front
		int rear = 0;
						
		for(int i=0; i<n; i++) {
			String[] input = br.readLine().split(" ");
			
			switch(input[0]) {
			case "front" : 
				if(rear-ft == 0) sb.append("-1\n");
				else sb.append(arr[ft] + "\n");
				break;
			case "back":
				if(rear-ft == 0) sb.append("-1\n");
				else sb.append(arr[rear - 1] + "\n");
				break;
			case "pop" : 
				if(rear-ft == 0) sb.append("-1\n");
				else sb.append(arr[ft++] + "\n");
				break;
			case "size" : sb.append(rear-ft + "\n");
				break;
			case "empty" : 
				if(rear-ft == 0) sb.append("1\n");
				else sb.append("0\n");
				break;
			default :
				if(input[0].substring(0, 4).equals("push")) {
					arr[rear++] = Integer.parseInt(input[1]);
				}
				break;
			}
		}
        System.out.print(sb.toString());
        br.close();
	}
}

 

 

2. 카드2(백준 2164번 문제)

 

2164번: 카드2 (acmicpc.net)

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

▷ 풀이 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class QueCard {

	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		Queue<Integer> que = new LinkedList<Integer>();
		
		int n;
		
		do {
			n = sc.nextInt();
		} while(n < 1 || n > 500000);
				
		for(int i=0; i<n; i++) {
			que.add(i+1);
		}
		
		while(n > 1) {			
			que.poll();
			
			int a = que.poll();
			
			que.add(a);
						
			n--;
		}
		
		System.out.println(que.poll());
	}
}

 

 

요즘 알고리즘 스터디를 통해 다양한 구조 및 내장 함수들을 배우고 있습니다!

이번에는 Queue라는 구조였는데 FIFO(FirstInFirstOut) 방식으로 처음 입력한 것을 먼저 내보내는 방식입니다!!

 

사용방법은 아래와 같습니다.

 

// 1. 큐 생성
Que<Integer> que = new LinkedList<Integer>();

// 2. add() or offer() 메소드를 이용해 저장
que.add(1);
que.add(2);
que.add(3);
que.add(4);
System.out.println(que);

// 출력 : [1, 2, 3, 4]


// 3. peek() 메소드를 이용해 처음 입력한 값 출력
System.out.println(que.peek());

// 출력 : 1

 
// 4. poll() 메소드를 이용한 값 출력 및 제거
System.out.println(que.poll());
System.out.println(que);

// 출력 : 1
// 출력 : [2, 3, 4]


// 5. remove() 메소드를 이용한 요소의 제거
// remove()만 사용하면 첫 번째 값 제거
que.remove(4);
System.out.println(que);

// 출력 : [2, 3]


6. clear()를 통해 queue 초기화
que.clear();
System.out.println(que);

// 출력 : []

 

위의 방식은 코딩테스트할 때 많이 사용된다고 하네요~

 

이제 코딩 테스트도 준비해야할 때가 온 것 같아요!!!

 

다음 스터디때는 재귀에 대해서 공부해볼게요~

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

728x90
반응형