728x90
문제
https://www.codetree.ai/problems/extract-specific-elements?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
수열에서 특정한 원소들을 추출하려 합니다. 이 수열에는 다음과 같은 3가지의 연산을 수행할 수 있습니다.
- 첫 번째 원소를 뽑아냅니다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak이 됩니다.
- 오른쪽으로 한 칸 이동시킵니다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 됩니다.
특정한 원소들을 모두 뽑아내려 할 때, 2번과 3번 연산을 최소한 몇 번 수행해야 하는지 알아내는 프로그램을 작성해 보세요.
입력 예시
10 3
2 9 5
출력 예시
8
코드
첫 번째 줄에는 수열의 크기 n과 추출하려는 원소의 개수 m이 주어집니다.
두 번째 줄에는 추출하려는 원소의 위치가 순서대로 주어집니다.
- 1 ≤ m ≤ n ≤ 50
- 1 ≤ 원소의 위치 ≤ n
첫 번째 줄에 문제의 정답을 출력합니다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 수열의 크기
int m = Integer.parseInt(st.nextToken()); // 추출할 원소 개수
// 덱 선언
List<Integer> deque = new LinkedList<>();
// 1부터 n까지 차례대로 넣기
for (int i = 1; i <= n; i++) {
deque.addLast(i);
}
int count = 0; // 연산 횟수
st = new StringTokenizer(br.readLine()); // 추출할 원소 위치
br.close();
// m번 반복
for (int i = 0; i < m; i++) {
// 추출할 원소의 위치에 해당하는 값
int target = deque.indexOf(Integer.parseInt(st.nextToken()));
int mid;
// 중간 인덱스
if (deque.size() % 2 == 0) {
mid = deque.size() / 2 - 1;
} else {
mid = deque.size() / 2;
}
// target이 중간 mid보다 작거나 같으면
if (target <= mid) {
// target까지 앞으로 찾기
for (int j = 0; j < target; j++) {
// 맨 앞에 있는 숫자를 맨 뒤로
deque.addLast(deque.removeFirst());
count++;
}
} else { // target이 mid보다 크면
// target까지 뒤로 찾기
for (int j = 0; j < deque.size() - target; j++) {
// 맨 뒤에 있는 숫자를 맨 앞으로
deque.addFirst(deque.removeLast());
count++;
}
}
// 덱에서 꺼내기
deque.pollFirst();
}
bw.write(String.valueOf(count));
bw.flush();
bw.close();
}
}
728x90