본문 바로가기

백준

[백준][JAVA]카드2(2164번) - 스택, 큐, 덱 algorithm

반응형

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

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

www.acmicpc.net

* 문제는 해당 게시물 참고바랍니다.

 

해당 문제는 큐(Queue)를 사용하여 동작을 구현하는 문제입니다.

 

Queue는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어 있습니다.

 

Queue의 경우 LinkedList 컬렉션 클래스로 구현하는 것이 가장 적합합니다.만약 배열기반의 ArrayList와 같은 컬렉션 클래스로 구현하게 되면 데이터를 꺼낼 때마다 빈 공간을 채우기 위해 데이터의 복사가 발생하므로 비효율적입니다. 그래서 데이터의 추가와 삭제가 쉬운 LinkedList로 구현하는 것이 더 적합합니다.

 

이제 해당 문제를 해결한 코드에 대해 설명하겠습니다.

import java.util.*;
public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        String tmp = "";

        Queue cardList = new LinkedList();

        for(int i=1; i<=n;i++){
            cardList.offer(i);
        }

        while(!cardList.isEmpty()){

            try {
                tmp = cardList.peek().toString();
                cardList.remove();
                tmp = cardList.peek().toString();
                cardList.offer(cardList.remove());
            } catch (NoSuchElementException e){
                System.out.println(tmp);
            } catch (NullPointerException e){
                System.out.println(tmp);
            }
        }
    }
}

 

Queue interface에 정의된 내용을 사용하고자 해당 방식으로 객체를 생성해서 사용했습니다.

Queue cardList = new LinkedList();

 

또한 try - catch를 이용하여 예외처리를 하여 원하는 조건으로 식이 반복되게 설정하였습니다.

 

* Object remove() 

해당 method는 Queue에서 객체를 꺼내 반환하고 비어있다면 NoSuchElementException을 발생시킵니다.

따라서 해당 Exception이 발생하면 try - catch를 통해 예외처리해줍니다.

 

* Object peek() 

해당 method는 삭제없이 요소를 읽어옵니다. Queue가 비어있으면 null을 반환합니다.

따라서 null이 발생하면  try - catch를 통해 NullPointException을 잡아서 예외처리해줍니다.

 

반응형