happy coding
[java] 10813. 공 바꾸기 본문
조건에 따라 입력을 다르게 받는 부분은 종종 헷갈려 하는 것 같아서, 이번에 실수까지 다 적으려고 한다.
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