백준 10811번: 양끝을 교환하며 바구니 뒤집기
백준 10811번 바구니 뒤집기는 배열에 1부터 n까지 바구니 번호를 넣고 입력으로 주어진 구간의 순서를 뒤집는 방식으로 풀었습니다.
바구니 번호 i, j에서 1을 빼 배열 인덱스로 바꿉니다. 구간의 왼쪽 끝 l과 오른쪽 끝 t의 값을 temp를 이용해 교환한 뒤 두 위치를 한 칸씩 안쪽으로 옮깁니다. l < t일 때만 반복하므로 두 위치가 만나거나 지나치면 뒤집기가 끝납니다.
풀이 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] bucket = new int[n];
for (int k = 0; k < n; k++) {
bucket[k] = k + 1;
}
int temp;
for (int k = 0; k < m; k++) {
st = new StringTokenizer(br.readLine(), " ");
int i = Integer.parseInt(st.nextToken()) - 1;
int j = Integer.parseInt(st.nextToken()) - 1;
for (int l = i, t = j; l < t; l++, t--) {
temp = bucket[l];
bucket[l] = bucket[t];
bucket[t] = temp;
}
}
for (int number : bucket) {
bw.write(number + " ");
}
bw.flush();
}
}subList로 구간을 다룰 수도 있을까
ArrayList의 subList를 바꾸면 원본도 바뀐다고 하니 이걸 활용할 수 있지 않을까요? 여기서는 배열의 값을 직접 교환했지만 구간을 다루는 다른 방법으로도 생각해 봤습니다.