백준 2164번 > JAVA/자바 > 채점 현황 + Queue api 사용
https://www.acmicpc.net/problem/2164
2164번: 카드2
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가
www.acmicpc.net
문제
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.
이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.
N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.
출력
첫째 줄에 남게 되는 카드의 번호를 출력한다.
예제 입출력
내 코드🐰
<Queue> 라이브러리 사용
<Scanner> 함수 사용
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
//Queue 선입 선출
//N장의 카드가 있다.
//차례로 1부터 N까지의 번호
//1번 카드가 제이리 위에, N번 카드가 제일 아래인 상태로 순서대로
//1을 버리면 234 -> 2를 제일 아래로 옮기기
// 342 3을 버리면 -> 4를 아래로 옮기기 24
/*
* 123456 -> 1을 버리고 2을 뒤로
34562 -> 3을 버리고 4을 뒤로
5624 -> 5를 버리고 6을 뒤로
246 -> 2를 버리고 4를 뒤로
64 -> 6를 버린다. 종료
Queue방식
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Queue<Integer> queue = new LinkedList<>();
for (int i=1; i<num+1; i++) {
queue.offer(i); //queue방식 줄세우기
}
while(queue.size() > 1) { //남은 줄이 1개일 경우 종료
queue.poll(); //맨앞에 원소를 버린다.
queue.offer(queue.poll()); //버
}
System.out.println(queue.poll()); //남은 원소 출력
}
}
<Array> 라이브러리 사용
<BufferedReader>함수 사용
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
Integer queue = (Integer.parseInt(bf.readLine()));
ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i=1; i<queue+1; i++) {
arr.add(i);
}
while(arr.size() > 1) {
arr.remove(0);
arr.add(arr.get(0));
arr.remove(0);
}
System.out.println(arr.get(0));
}
}
Queue란?
Queue는 우리가 일상에서 줄을 서서 기다릴 때를 생각해본다면 이해하기 매우 쉽습니다.
먼저 들어온 데이터 순서대로 처리되는 데이터 구조를 의미합니다.
Queue사용법
1. 선언
import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언
Queue<String> queue = new LinkedList<>(); //String형 queue 선언
2. 값 추가
queue.add(1); // int queue에 값 1 추가
queue.add(2); // int queue에 값 2 추가
queue.add(3); // int queue에 값 3 추가
queue.offer(1); // queue에 값 1 추가
queue.offer(2); // queue에 값 2 추가
queue.offer(3); // queue에 값 3 추가
queue.add("A"); //String queue에 값 A 추가
queue.add("B"); //String queue에 값 B 추가
queue.add("C"); //String queue에 값 C 추가
- add(vaule) 와 offer(value)는 같은 값을 추가할 수 있는 메서드로 사용됩니다.
- add(value)메소드 같은 경우 데이터가 추가될 때 true를 반환하여 큐 공간에 영향을 끼쳐 오류를 발생시킬 수 있습니다.
3. 값 삭제
queue.poll(); // queue에 첫번째 값을 반환하고 제거 비어있다면 null
queue.remove(); // queue에 첫번째 값 제거
queue.clear(); // queue 초기화