728x90
전형적으로 deque을 이용한 큐 돌리기 문제였다.
처음에는 문제를 잘못 읽어서 테스트케이스 2번이 어떻게 되나 했는데 그냥 시계방향, 반시계방향 돌리면서 해당 원소가 나올 때의 최솟값들을 합하면 된다는 것을 알았다.
<문제 접근/풀이과정>
1. 덱을 활용한 원형큐 느낌이 들었음
2. 시계방향, 반시계방향으로 움직이며 원소들을 일일이 확인하고 두 방향 중 최솟값을 answer에 더하면 끝
+참고: 덱은 front, tail부분에 삽입, 삭제, 조회가 가능한 자료구조이다.
<소스코드>
package boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Boj_1021 {
public static void main(String[] args) throws IOException {
// 1번 연산 : poll
// 2번 연산 : pushright(popleft)
// 3번 연산 : pushleft(popright)
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stz = new StringTokenizer(br.readLine());
int M = Integer.parseInt(stz.nextToken());
int N = Integer.parseInt(stz.nextToken());
int answer = 0;
Deque<Integer> dq1 = new ArrayDeque<>();
Deque<Integer> dq2 = new ArrayDeque<>();
for (int i = 1; i <= M; i++) {
dq1.addLast(i);
dq2.addLast(i);
}
stz = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
int target = Integer.parseInt(stz.nextToken());
answer += Math.min(CCW(dq1, target), CW(dq2, target));
}
System.out.println(answer);
}
private static int CW(Deque<Integer> dq, int target) {
int cnt = 1;
while(true) {
int temp = dq.pollLast();
if(temp == target) {
return cnt;
}else {
cnt++;
dq.addFirst(temp);
}
}
}
private static int CCW(Deque<Integer> dq, int target) {
int cnt = 0;
while(true) {
int temp = dq.pollFirst();
if(temp == target) {
return cnt;
}else {
cnt++;
dq.addLast(temp);
}
}
}
}
728x90
'알고리즘공부(Algorithm Study) > 문제풀이(ProblemSolving)' 카테고리의 다른 글
백준 1780 java - 종이의 개수 (0) | 2022.04.20 |
---|---|
백준 5430 java - AC (0) | 2022.04.19 |
백준 18258 - 큐 2 JAVA (0) | 2022.04.17 |
백준 2004 - 조합 0의 개수 JAVA (0) | 2022.04.17 |
백준 3036 - 링 JAVA (0) | 2022.04.15 |
댓글