Algorithm/Java

[백준] n.10811 - 바구니 번호 뒤집기

보라해바라기 2023. 5. 14. 23:05
SMALL

1. 문제

https://www.acmicpc.net/problem/10811

 

10811번: 바구니 뒤집기

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

www.acmicpc.net

2. 주요 개념

- 1차원 배열 선언/할당

-  반복문 (for문), 중첩 반복문

- 스캐너 ~ 값 입력 받기

- 조건문

- continue


3. 나의 풀이 (*은 잘 안풀린 부분)

import java.io.*;
import java.util.*;

public class Main {

  public static void main(String[] args) {

    Scanner s = new Scanner(System.in);

    int n, m, i, j, t, temp;
    // n: 바구니 갯수, m: 바구니를 바꿀 횟수
    // i: 바꿀 시작 바구니, j: 바꿀 끝 바구니
    // t: 반복문에 사용하는 변수
    // temp: 바구니 번호 임시 저장소
    
    n = s.nextInt();
    m = s.nextInt();

    if ( 1<=n && n<=100 && 1<=m && m<=100 ){
      int[] arr = new int[n];
      // 바구니 번호
      
      for (t = 0; t < n; t++) {
        arr[t] = t + 1;
      } // 배열에 번호 부여
  
      for (t = 0; t < m; t++) {   
        i = s.nextInt(); 
        // 음수 인덱스: 에러 발생 -> 하위 조건문에서 i-1 실행.
        j = s.nextInt(); 
        // 음수 인덱스: 에러 발생 -> 하위 조건문에서 j-1 실행.
        if ( i<j ) {
          if (j-i==1){
            temp = arr[i-1]; // 배열 인덱스와 1 차이 남. 
            arr[i-1] = arr[j-1];
            arr[j-1] = temp;
          } else {
            int c = (j-i+1)/2; // 바꿀 횟수 지정
            // c 선언 과정에서 배열 초과 에러 발생 > 해결!
            for (int a = 0; a<c; a++) {
              temp = arr[i-1];
              arr[i-1] = arr[j-1];
              arr[j-1] = temp;
              i++;
              j--;
            }
          }
            } else if ( i==j ) {
          continue;
        } else {
          System.out.println("i, j 다시 입력");
        }
      }
  
      for (t = 0; t < n; t++) {
        System.out.print(arr[t] + " ");
      }
    } else {
      System.out.println("n, m 다시 입력");
    }

  }

}


4. 짚고 넘어가기!

- 초반에 계속 런타임 에러 (ArrayIndexOutOfBounds) 발생 

 

- why?

- 1. (문제) i와 j값을 입력할 때, 1 작은 값으로 저장하도록 선언 > 반복문에서 음수 인덱스로 바뀌는 상황 발생

      > (해결)각 반복문에서 "인덱스 - 1"을 하여 음수 인덱스가 되지 않도록 수정!  

     => 음수 인덱스를 사용하면, ArrayIndexOutOfBounds 발생

- 2. (문제) 변수 c(바꿀 횟수 지정)에서 배열을 벗어나는 인덱스 값 생성

       > (해결) 반복 횟수가 (j-i+1)/2 이라는 규칙 발견 후, 수정!

      => 인덱스배열 인덱스를 벗어나면, ArrayIndexOutOfBounds 발생

 

- 바구니 번호와 실제 배열의 숫자 차이는 1! => 배열 값을 바꿀 땐, 차이 1을 고려하여서 코드 작성!

 

728x90