문제
문제 풀이
백준문제들은 문제를 해석을 하는 것이 매우 힘들다.. 문제 해석한 내용은 아래와 같다.
처음에는 사이즈가 4인 큐가 있다.
1. 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
2. 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
3. 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.
여기서 1번으로 무조건 poll을 하고 2,3 번으로 위치를 바꿀 때 뽑아야 하는 값들을 다 뽑을 때까지 2,3번 규칙을 몇번을 수행했느냐를 반환하면 된다.
나의 답안
덱을 구현하는데 LinkedList를 이용하였다. 원하는 값을 찾을 때는 indexOf 함수를 사용하여 인덱스 값을 구하였고 해당 인덱스 값이 덱의 전체 길이 / 2 보다 작냐 크냐에 따라 원하는 조건문을 수행하도록 하였다.
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
int[] arrA = Arrays.stream(s1.split(" ")).mapToInt(Integer::parseInt).toArray();
int[] arrB = Arrays.stream(s2.split(" ")).mapToInt(Integer::parseInt).toArray();
System.out.println(check(arrA, arrB));
}
public static int check(int[] arrA, int[] arrB) {
int count = 0;
int target;
LinkedList<Integer> deque = new LinkedList<>();
int[] arrFind = arrB.clone();
for (int i = 1; i <= arrA[0]; i++) {
deque.offer(i);
}
for (int i = 0; i < arrFind.length; i++) {
target = deque.indexOf(arrFind[i]);
int half = deque.size() / 2;
if (target <= half) {
while (target != 0) {
deque.offerLast(deque.pollFirst());
target--;
count++;
}
} else {
while (target != deque.size()) {
deque.offerFirst(deque.pollLast());
target++;
count++;
}
}
deque.pollFirst();
}
return count;
}
}
'BackJoon > Algorithm' 카테고리의 다른 글
(9012)괄호 (0) | 2023.03.21 |
---|---|
(24174) 알고리즘 수업 - 힙 정렬 2 (1) | 2023.03.19 |
(1158) 요세푸스 문제 (0) | 2023.03.17 |
(10818) 최소, 최대 (0) | 2023.03.15 |
(25556번) 포스택 (0) | 2023.03.13 |