반응형

 

📖 문제

 

📋 코드

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		Queue<Integer> q = new LinkedList<>();
		Queue<Integer> find = new LinkedList<>();

		int N = sc.nextInt();
		int M = sc.nextInt();
		int ans = 0;

		for (int i = 1; i <= N; i++) {
			q.add(i);
		}
		for (int i = 0; i < M; i++) {
			int x = sc.nextInt();
			find.add(x);
		}

		while (!find.isEmpty()) {
			int x = find.poll();
			int cnt = 0;
			while (x != q.peek()) {
				int qFront = q.poll();
				q.add(qFront);
				cnt++;
			}
			ans += Math.min(cnt, q.size() - cnt);
			q.poll();
		}
		System.out.println(ans);
	}
}

👨🏻‍💻 결과

 

📕 풀이 방법

예제 입력 2를 예시로 들자면

Queue<Integer> q = new LinkedList<>();
Queue<Integer> find = new LinkedList<>();

q는 N개의 원소를 포함하고 있는 양방향 순환 큐 <1, 2, 3, 4, 5, 6, 7, 8, 9, 10>
find는 찾아야 하는 수 <2, 9, 5>

 

while (!find.isEmpty()) {
	int x = find.poll();
	// 생략
}

찾아야 하는 수를 하나씩 뽑아내서 x로 저장

 

while (!find.isEmpty()) {
	int x = find.poll();
	int cnt = 0;
	while (x != q.peek()) {
		int qFront = q.poll();
		q.add(qFront);
		cnt++;
	}
	ans += Math.min(cnt, q.size() - cnt);
	q.poll();
}

peek() : 큐의 맨 앞 원소 리턴
poll() : 큐의 맨 앞 원소 리턴 후 삭제

찾아야 하는 원소 x가 큐의 맨 앞에 올 때까지 2번 연산을 반복합니다.

그리고 2번 연산의 수가 cnt로 기록되는데
cnt가 q.size()-cnt 보다 작다면 2번 연산수가 최솟값이고
아니라면 3번 연산수가 최솟값입니다.

 

🔗 링크

https://www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

 

반응형

'🧩PS > 🥈Nomal' 카테고리의 다른 글

[C++] 백준 14725번 - 개미굴  (2) 2022.01.14
[JAVA] 백준 5430번 - AC  (0) 2022.01.10
[JAVA] 백준 1966번 - 프린터 큐  (0) 2022.01.04
[JAVA] 백준 18258번 - 큐 2  (0) 2021.12.07
[JAVA] 백준 17298번 - 오큰수  (0) 2021.12.06

+ Recent posts