Algorithms/백준

[백준] '바구니 뒤집기' - Java

LEFT 2024. 6. 2. 19:54

<문제 제시>

도현이는 바구니를 총 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