문제
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
풀이
- 앞뒤로 삽입, 삭제가 가능하다 => Deque 개념 활용
- 큐에 처음 포함되어 있던 수 = 큐의 크기 = N => 큐에 1~N까지 삽입한다.
- M개만큼 뽑아낼 값을 입력받는다.
- 연산의 최소값을 구한다.
- 큐의 가운데 인덱스를 기준으로 구하려는 값이
- 가운데보다 왼쪽에 존재할 경우, 큐를 왼쪽으로 한 칸씩 이동
- 왼쪽으로 이동하다가 원하는 값이 나오면
- 반복 종료 후 poll
- 왼쪽으로 이동하다가 원하는 값이 나오면
- 가운데보다 오른쪽에 존재할 경우, 큐를 오른쪽으로 한 칸씩 이동
- 오른쪽으로 이동하다가 원하는 값이 나오면
- 반복 종료 후 poll
- 오른쪽으로 이동하다가 원하는 값이 나오면
- 가운데보다 왼쪽에 존재할 경우, 큐를 왼쪽으로 한 칸씩 이동
- 큐의 가운데 인덱스를 기준으로 구하려는 값이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
LinkedList<Integer> dq = new LinkedList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
for(int i=1;i<=N;i++) {
dq.add(i);
}
ArrayList<Integer> arr = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i=0;i<M;i++) {
int n = Integer.parseInt(st.nextToken());
arr.add(n);
}
int cnt = 0;
for(int i: arr) {
int idx = dq.indexOf(i);
int mid = dq.size() / 2;
if(idx > mid) {
while(i != dq.getFirst()) {
cnt++;
dq.addFirst(dq.removeLast());
}
}
else {
while(i != dq.getFirst()) {
cnt++;
dq.addLast(dq.removeFirst());
}
}
dq.removeFirst();
}
System.out.println(cnt);
}
}
'🧶Problem Solving' 카테고리의 다른 글
BOJ 1927번: 최소 힙 (0) | 2023.05.26 |
---|---|
BOJ 1874번: 스택 수열 (0) | 2023.05.25 |
BOJ 1011번: Fly me to the Alpha Centauri (0) | 2023.05.24 |
BOJ 2439번: 별 찍기 - 2 (0) | 2023.05.01 |
문제
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
풀이
- 앞뒤로 삽입, 삭제가 가능하다 => Deque 개념 활용
- 큐에 처음 포함되어 있던 수 = 큐의 크기 = N => 큐에 1~N까지 삽입한다.
- M개만큼 뽑아낼 값을 입력받는다.
- 연산의 최소값을 구한다.
- 큐의 가운데 인덱스를 기준으로 구하려는 값이
- 가운데보다 왼쪽에 존재할 경우, 큐를 왼쪽으로 한 칸씩 이동
- 왼쪽으로 이동하다가 원하는 값이 나오면
- 반복 종료 후 poll
- 왼쪽으로 이동하다가 원하는 값이 나오면
- 가운데보다 오른쪽에 존재할 경우, 큐를 오른쪽으로 한 칸씩 이동
- 오른쪽으로 이동하다가 원하는 값이 나오면
- 반복 종료 후 poll
- 오른쪽으로 이동하다가 원하는 값이 나오면
- 가운데보다 왼쪽에 존재할 경우, 큐를 왼쪽으로 한 칸씩 이동
- 큐의 가운데 인덱스를 기준으로 구하려는 값이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
LinkedList<Integer> dq = new LinkedList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
for(int i=1;i<=N;i++) {
dq.add(i);
}
ArrayList<Integer> arr = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i=0;i<M;i++) {
int n = Integer.parseInt(st.nextToken());
arr.add(n);
}
int cnt = 0;
for(int i: arr) {
int idx = dq.indexOf(i);
int mid = dq.size() / 2;
if(idx > mid) {
while(i != dq.getFirst()) {
cnt++;
dq.addFirst(dq.removeLast());
}
}
else {
while(i != dq.getFirst()) {
cnt++;
dq.addLast(dq.removeFirst());
}
}
dq.removeFirst();
}
System.out.println(cnt);
}
}
'🧶Problem Solving' 카테고리의 다른 글
BOJ 1927번: 최소 힙 (0) | 2023.05.26 |
---|---|
BOJ 1874번: 스택 수열 (0) | 2023.05.25 |
BOJ 1011번: Fly me to the Alpha Centauri (0) | 2023.05.24 |
BOJ 2439번: 별 찍기 - 2 (0) | 2023.05.01 |