티스토리 뷰
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n, m;
static ArrayList<Integer> q = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = Integer.parseInt(stk.nextToken());
m = Integer.parseInt(stk.nextToken());
for(int i=0; i<=n; i++) {
q.add(i);
}
stk = new StringTokenizer(br.readLine());
int count = 0;
for(int i=0; i<m; i++) {
int target = Integer.parseInt(stk.nextToken());
// target이 현재 맨 앞
if(q.get(1) == target) {
q.remove(1);
continue;
}
int index = q.indexOf(target);
int frontSteps = q.indexOf(target) - 1; // 앞을 옮기는 것
int backSteps = q.size()-1-index; // 뒤를 옮기는 것
// 앞을 옮기는 게 빠름
if(frontSteps <= backSteps) {
// target이 맨앞에 올때까지 2번 연산
while(q.get(1) != target) {
int temp = q.remove(1);
q.add(temp);
count++;
}
q.remove(1);
}
// 뒤를 옮기는 게 빠름
else {
// target이 맨앞에 올때까지 3번 연산
while(q.get(1) != target) {
int temp = q.remove(q.size()-1);
q.add(1, temp);
count++;
}
q.remove(1);
}
}
System.out.println(count);
}
}
자료구조 문제입니다.
큐의 앞과 뒤에서 모두 삽입/삭제가 가능한 덱 구조를 사용하여 풀면 됩니다.
다만 자바의 Deque는, 인덱스 접근이 안 된다는 불편함이 있기에 ArrayList를 사용했습니다.
✨ 로직 설명
- 현재 뽑아내야하는 원소를
target
으로 둡니다. target
을 뽑기 위해서 앞의 원소를 뒤로 보내는 연산을 해야할지 / 뒤의 원소를 앞을 보내는 연산을 해야할지 결정합니다. 둘 중 더 적은 수의 연산을 해도 되는 쪽으로 선택합니다.- 이를
frontSteps
,backSteps
라고 표현했습니다. frontSteps <= backSteps
에서 등호를 함께 사용한 이유는, 앞쪽에 원소가 위치한 경우 뒤쪽에 위치한 경우보다 한 번 연산을 적게 할 수 있기 때문입니다.
https://www.acmicpc.net/board/view/24395
이 게시글이 많은 도움이 되었습니다.
'알고리즘 > 알고리즘 연습' 카테고리의 다른 글
[프로그래머스] 마법의 엘리베이터 (0) | 2023.04.04 |
---|---|
[BOJ_1991] 트리 순회 (0) | 2023.04.02 |
[BOJ_2295] 세 수의 합 (0) | 2022.07.01 |
[BOJ_16472] 고냥이 Java (투 포인터) (0) | 2022.05.23 |
[BOJ_9694] 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 Java (다익스트라, 경로 추적) (1) | 2022.05.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- BuilderPattern
- 시퀀스가존재하지않습니다
- 시퀀스
- 알고리즘
- greedy
- BAEKJOON
- 백준1976
- Java
- 투포인터 #알고리즘
- 자바
- 트리순회
- ORA-02289
- 프로그래머스
- 후위순회
- 탐욕법
- 유니온파인드
- 전위순회
- 중위순회
- 스레드
- 여행가자
- effectivejava
- 이진트리
- 분리집합
- Sequence
- 빌더패턴
- 생성자
- 이펙티브자바
- deque
- 백준
- 정적팩터리메서드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함