본문 바로가기
알고리즘/백준

백준 10811 바구니 뒤집기 (JAVA 자바 풀이)

by Renechoi 2023. 7. 2.

백준 10811 바구니 뒤집기 (JAVA 자바 풀이)

 


 

 

 


 

1차원 배열을 연습하는 문제로서 지난 문제 10813 공바꾸기를 좀 더 응용한 문제이다. 

 

swap과 reverse를 수행해주면 된다. 

 

reverse는 새로운 배열을 만들어서 전체를 새롭게 할당하는 방법도 있지만 처음과 끝을 하나씩 바꿔주는 방식으로 수행할 수도 있다. 

 

이때 while문과 for문 방식 두가지 모두 사용할 수 있다. 

 

둘다 반복 횟수는 길이 + 1를 2로 나눈 몫으로 구한다. 

 

while문을 사용하면 별도의 카운트 변수를 두어 처음과 끝에서부터 증감을 표현해준다. 

 

for문을 사용하면 i 변수를 사용할 수 있다. 

 

💡 코드 구현

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.stream.IntStream;

public class Main {

   private static final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

   public static void main(String[] args) throws IOException {

      StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
      int N = Integer.parseInt(stringTokenizer.nextToken());
      int M = Integer.parseInt(stringTokenizer.nextToken());

      int[] bucket = new int[N + 1];

      IntStream.range(1, bucket.length).forEach(i -> bucket[i] = i);

      while (M-- > 0) {
         stringTokenizer = new StringTokenizer(bufferedReader.readLine());
         int i = Integer.parseInt(stringTokenizer.nextToken());
         int j = Integer.parseInt(stringTokenizer.nextToken());

         reverse(i, j, bucket);
      }

      StringBuilder stringBuilder = new StringBuilder();
      IntStream.range(1, bucket.length).forEach(i -> stringBuilder.append(bucket[i]).append(" "));
      System.out.println(stringBuilder);
   }

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

   private static void reverse(int start, int end, int[] bucket) {
      int repeat = (end - start + 1) / 2;
      while (repeat-- > 0) {
         swap(start, end, bucket);
         start++;
         end--;
      }
   }

   private static void reverse2(int start, int end, int[] bucket) {
      int repeat = (end - start + 1) / 2;
      for (int i = 0; i < repeat; i++) {
         swap(start + i, end - i, bucket);
      }
   }
}

 

 

 

 

 

 

반응형