happy coding

[java] 10813. 공 바꾸기 본문

coding study/baekjoon

[java] 10813. 공 바꾸기

yeoonii 2023. 8. 8. 15:17

조건에 따라 입력을 다르게 받는 부분은 종종 헷갈려 하는 것 같아서, 이번에 실수까지 다 적으려고 한다.

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st1 = new StringTokenizer(br.readLine());

        //첫째 줄 입력 >> 바구니 개수와 몇 번 바꿀지
        int N = Integer.parseInt(st1.nextToken());
        int M = Integer.parseInt(st1.nextToken());

        int[] array = new int[N];

        for (int i = 0; i < N; i++) {
            array[i] = i + 1; // 바뀌기 전에 배열 초기화
        }

        System.out.println("바뀌기 전");

        for (int i=0 ; i<N ; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();

        //둘째 줄 입력 받음 >> 어떻게 바꿀지
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i=0 ; i<M ; i++) {
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            //a와 b번 공의 위치를 바꾼다.
            int temp = array[a];
            array[a] = array[b];
            array[b] = temp;
        }
        
        System.out.println("바뀐 후");

        //전체적인 공의 위치를 출력한다.
        for (int i=0 ; i<N ; i++) {

            System.out.print(array[i] + " ");
        }

    }
}

일단 중간 확인을 위해서 이렇게 코드를 작성했다. 근데 

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347)
at Main.main(Main.java:29) 에러가 떠서 확인해보니까 StringTokenizer가 더 이상 읽을 토큰이 없을 때 발생합니다. 주로 이 오류는 입력 데이터에 예상하지 못한 문제가 있을 때 발생 한다고 한다.  그래서 아래와 같이 수정했다.

 

        //둘째 줄 입력 받음 >> 어떻게 바꿀지
        StringTokenizer st;
        for (int i=0 ; i<M ; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            //a와 b번 공의 위치를 바꾼다.
            int temp = array[a];
            array[a] = array[b];
            array[b] = temp;
        }

1. 새롭게 받을 입력 줄을 선언한다음 2. 반복문 안에 그 입력줄을 어떻게 받을지 선언하였다. 그리고 3. 공의 위치를 바꿀 때, 입력으로 받은 a와 b를 0-based 인덱스로 변환하여 처리하도록 수정했다.

 

다음부터는 틀리고 싶지 않다.

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st1 = new StringTokenizer(br.readLine());

        //첫째 줄 입력 >> 바구니 개수와 몇 번 바꿀지
        int N = Integer.parseInt(st1.nextToken());
        int M = Integer.parseInt(st1.nextToken());

        int[] array = new int[N];

        // 바뀌기 전에 배열 초기화
        for (int i = 0; i < N; i++) {
            array[i] = i + 1;
        }

        //둘째 줄 입력 받음 >> 어떻게 바꿀지
        StringTokenizer st;
        for (int i=0 ; i<M ; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            //a와 b번 공의 위치를 바꾼다.
            int temp = array[a];
            array[a] = array[b];
            array[b] = temp;
        }

        //전체적인 공의 위치를 출력한다.
        for (int i=0 ; i<N ; i++) {
            System.out.print(array[i] + " ");
        }

    }
}

완성본..

'coding study > baekjoon' 카테고리의 다른 글

[java] 1550. 16진수  (0) 2023.08.08
[java] 1026. 보물  (0) 2023.08.08
[java] 25304. 영수증  (0) 2023.08.05
[java] 2562. 최댓값  (0) 2023.08.04
[java] 2752. 세 수 정렬  (0) 2023.08.01
Comments