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

    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

    댓글