[백준/Java] #10811 바구니 뒤집기

하늘·2023년 5월 2일
0
post-thumbnail

✔️ 문제 설명

#10811

문제
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

출력
모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

💡 풀이

풀이 GitHub

int[] bucket = IntStream.rangeClosed(1, N).toArray();

우선 바구니를 1부터 N까지 N의 길이만큼 하나 생성해주고

for(int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken()) - 1;
            int end = Integer.parseInt(st.nextToken()) - 1;
            changeArr(bucket, start, end);
        }

M번동안 for문을 돌면서 start 인덱스와 end 인덱스를 배열 인덱스로 사용하기 위해 -1을 한 뒤 저장해주고, 따로 만든 changeArr 매서드를 호출해서 자리를 역순으로 바꿔줬다.

public static int[] changeArr(int[] bucket, int start, int end) {
        if (start == end) {
            return bucket;
        }
        int i = 0;
        do {
            int tmp = bucket[start + i];
            bucket[start + i] = bucket[end - i];
            bucket[end - i] = tmp;
            i++;
        } while (i <= (end - start) / 2);

        return bucket;
    }

위에 코드는 start 인덱스부터 end 인덱스까지 역순으로 자리를 바꾸는 코드이다.

for(int i = 0; i < bucket.length; i++) {
            bw.write(String.format("%d ", bucket[i]));
        }

출력을 위한 코드

옛날에 비슷한 문제로 풀어봤던 문젠데 까먹어서 꽤 고전했다.. 처음에 역순으로 자리를 바꾸는 코드를 main에 한 번에 다 집어넣었다가 자꾸 idx 값을 어떻게 해야하지 헷갈려서 문제 설명에 있는 테스트 케이스조차 실패하는 바람에 멘붕이 와서 시간을 엄청나게 오래 썼다ㅠ..ㅎ 진작에 나눌걸.. 여튼 까먹지 않기 위해 정리해둔다! 다음엔 까먹지 말아야지,,,

profile
취뽀까지 화이띵

0개의 댓글