250512 배열 정렬

Jongleee·2025년 5월 12일
0

TIL

목록 보기
896/970
static class Info implements Comparable<Info> {
	int dist, num;

	Info(int dist, int num) {
		this.dist = dist;
		this.num = num;
	}

	@Override
	public int compareTo(Info other) {
		return this.dist - other.dist;
	}
}

public static void main(String[] args) throws IOException {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	int n = Integer.parseInt(br.readLine());
	int[] initialArray = readArray(br, n);
	int m = Integer.parseInt(br.readLine());
	int[][] operations = readOperations(br, m);

	Map<Integer, Integer> distance = new HashMap<>();
	int startNum = toInt(initialArray, n);
	distance.put(startNum, 0);

	PriorityQueue<Info> queue = new PriorityQueue<>();
	queue.offer(new Info(0, startNum));

	Arrays.sort(initialArray);
	int targetNum = toInt(initialArray, n);

	while (!queue.isEmpty()) {
		Info current = queue.poll();
		if (current.num == targetNum) {
			break;
		}
		int[] currentArray = toArray(current.num, n);
		for (int[] op : operations) {
			swap(currentArray, op[0], op[1]);
			int nextNum = toInt(currentArray, n);
			int nextCost = current.dist + op[2];
			if (!distance.containsKey(nextNum) || distance.get(nextNum) > nextCost) {
				distance.put(nextNum, nextCost);
				queue.offer(new Info(nextCost, nextNum));
			}
			swap(currentArray, op[0], op[1]);
		}
	}

	System.out.println(distance.getOrDefault(targetNum, -1));
}

private static int[] readArray(BufferedReader br, int size) throws IOException {
	int[] array = new int[size];
	StringTokenizer st = new StringTokenizer(br.readLine());
	for (int i = 0; i < size; i++) {
		array[i] = Integer.parseInt(st.nextToken()) - 1;
	}
	return array;
}

private static int[][] readOperations(BufferedReader br, int count) throws IOException {
	int[][] ops = new int[count][3];
	for (int i = 0; i < count; i++) {
		StringTokenizer st = new StringTokenizer(br.readLine());
		ops[i][0] = Integer.parseInt(st.nextToken()) - 1;
		ops[i][1] = Integer.parseInt(st.nextToken()) - 1;
		ops[i][2] = Integer.parseInt(st.nextToken());
	}
	return ops;
}

private static int toInt(int[] array, int length) {
	int value = 0;
	for (int i = 0; i < length; i++) {
		value = value * 10 + array[i];
	}
	return value;
}

private static int[] toArray(int number, int length) {
	int[] array = new int[length];
	for (int i = length - 1; i >= 0; i--) {
		array[i] = number % 10;
		number /= 10;
	}
	return array;
}

private static void swap(int[] array, int i, int j) {
	int temp = array[j];
	array[j] = array[i];
	array[i] = temp;
}

출처:https://www.acmicpc.net/problem/28707

0개의 댓글