[ 목차 ]
📢 문제 출처
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
⏰ 문제 설명
⏰ 입출력 예시
⏰ 문제 풀이 정리 (feat. 문제이해를 제대로 못해서 그림으로 정리)
⏰ 풀이
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class SpinningQueue {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //크기
int m = sc.nextInt(); //갯수
LinkedList queue = new LinkedList();
// Queue queue = new LinkedList();
for (int i = 0; i < n; i++) {
queue.add(i + 1);
}
int count = 0;
//움직일 때 최소값으로 이동해야한다!!!
//ex. 왼쪽이 2이고, 오른쪽이 3이면, 2로 이동해야한다.
for (int i = 0; i < m; i++) {
int num = sc.nextInt();
int index = queue.indexOf(num); //시스템에 적은 값의 인덱스 위치 확인
int half_size = queue.size()/2; //중간을 기준으로 어느 방향으로 갈지 확인
//사용자가 넣은 값이 리스트의 첫번째 위치가 아니면
while(num != (int)queue.getFirst())
{
//중간보다 작으면(왼쪽으로)
if(index <= half_size){
queue.add(queue.removeFirst()); //queue.removeFirst() 위치에 더해라
}
//중간보다 크면(오른쪽으로)
else{
queue.addFirst(queue.removeLast()); //queue.removeLast() 위치에 더해라
}
count++;
}
queue.removeFirst(); //옮긴 다음에는 옮긴 숫자(첫번째 위치의 값)를 지워라.
}
System.out.println(count);
}
}
✔ Queue queue 대신에 LinkedList 사용한 이유
-. Queue로 오만가지 대입을 해보다가 정 안되서. queue를 생성할 때 LinkedList를 사용하기에 변경 진행해봤다.
✔ LinkedList의 속성
-. 내부적으로 양방향의 연결리스트로, 참조하려는 원소에 따라서 순방향, 역방향으로 순회 가능하다.
-. Queue의 속성인 "선입선출"도 LinkedList를 이용하면 사용이 가능하다는 것이다.
-. Queue로 진행했을 때 막히면, LinkedList로 선언해서 Queue처럼 사용하면 괜찮은 방안인 거 같다.
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[Java][백준 2743번] : 단어 길이 재기 (0) | 2023.08.10 |
---|---|
[Java][백준 10818번] : 최소, 최대 (0) | 2023.08.09 |
[Java][백준 25556번] : 포스택 (0) | 2023.08.08 |
댓글