<문제 제시>
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.
도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.
바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.
<문제 해결 과정>
N개의 바구니, M번의 테스트케이스가 주어진다. 예를 들어 1 2가 주어지면
1번바구니부터 2번바구니까지의 순서를 '역순'으로 만드는 문제이다.
1 2 3 4 5 -> 2 1 3 4 5
1 4 가 주어지면,
2 1 3 4 5 -> 4 3 1 2 5 처럼 되는 것이다.
<Try 1>
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] basket = new int[N];
for(int i = 0; i < N; i++) {
basket[i] = i+1;
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int I = Integer.parseInt(st.nextToken())-1;
int J = Integer.parseInt(st.nextToken())-1;
for(int j = 0; j < (J - I / 2); j++) {
int temp = basket[I];
basket[I] = basket[J];
basket[J] = temp;
System.out.println("[" + I + "] 와 [" + J + "]를 바꿉니다.");
System.out.println("진행 중... " + Arrays.toString(basket));
I++;
J--;
}
}
System.out.println(Arrays.toString(basket));
for(int i = 0; i < basket.length; i++) {
System.out.print(basket[i] + " ");
}
I++, J--를 통해 서로 인덱스를 변화해나가며 temp 임시변수를 통해 바꾸는 방법을 시도해보았다.
하지만 결과는 런타임에러발생.
예제 케이스는 출력이 되었지만 답변을 제출 시에 오류가 발생하였다.
<Answer 1>
for(int i = 0; i < N; i++) {
basket[i] = i+1;
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int I = Integer.parseInt(st.nextToken())-1;
int J = Integer.parseInt(st.nextToken())-1;
while (I < J) {
int temp = basket[I];
basket[I++] = basket[J];
basket[J--] = temp;
}
}
I번째부터 J번째까지 바구니를 역순으로 정렬하는것이므로
I가 J보다 작을때까지 무한반복해주며,
basket[I++] 처럼 안에서 증감연산자를 사용하여 temp임시변수를 통해 위치를 바꿔준다.
<전체 코드>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class q_10811_flipbasket {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] basket = new int[N];
for(int i = 0; i < N; i++) {
basket[i] = i+1;
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int I = Integer.parseInt(st.nextToken())-1;
int J = Integer.parseInt(st.nextToken())-1;
while (I < J) {
int temp = basket[I];
basket[I++] = basket[J];
basket[J--] = temp;
}
}
System.out.println(Arrays.toString(basket));
for(int i = 0; i < basket.length; i++) {
System.out.print(basket[i] + " ");
}
}
}
반복의 범위를 정하는 것이 주요한 문제인 것 같았다. while(I < J)처럼 증감시키며 basket 배열의 순서를 바꿔가는 문제였다.
<문제 링크>
https://www.acmicpc.net/problem/10811
'Algorithms > 백준' 카테고리의 다른 글
[백준] '바구니 순서 바꾸기' - Java (0) | 2024.06.02 |
---|---|
[백준] '검증수' - Java (1) | 2024.06.02 |
[백준] '공 넣기' - Java (0) | 2024.06.01 |
[백준] '공 바꾸기' - Java (0) | 2024.06.01 |
[백준] '럭비 클럽' - Java (0) | 2024.06.01 |