처음 백준 문제를 풀때 가장 많이 헷갈리는 부분이 입출력을 어떻게 받는가이다.

 

아직 StringTokenizer의 사용법이 헷갈려서 오류가 뜰 때가 많다.

처음에 가장 많이 떳던 오류는 NoSuchElementException였다.

 

아직 정확한 원인은 모르지만

nextToken으로 받은 후 값을 사용하지 않고 바로 nextToken을 사용하여 다른 값을 받으려고 하면 뜬다. 

 

또 StringTokenizer는 무조건 '공백'으로만 입력받는다! 줄 단위로 입력받고 싶으면 그냥 readLine()을 바로 쓰면 된다.

 

추후에 다른 오류들을 만나며 더 알아봐야겠다.

 

 

이번에는 백준 2675번 문제를 풀던 중 다음과 같이 ArrayIndexOutOfBoundsException이 발생하였고 해석해보면 인덱스 1은 배열 1의 길이를 벗어낫다고 한다.

 

 

 

처음에 짠 코드는 다음과 같다.

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

public class baek_2675 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= T; i++) {
            String[] input = st.nextToken().split(" ");
            for(int j=0; j<input[1].length(); j++) {
                bw.write((input[1].charAt(j)+"").repeat(Integer.parseInt(input[0])));
            }
            //줄바꿈
            bw.write("\n");
        }
        br.close();
        bw.flush();
        bw.close();
    }

}

2
3 ABC
5 /HTP

의 입력값을 넣어줘야 하는데

 

2

3 ABC까지 입력하자마자 다음과 같은 오류가 발생하였다.

 

디버깅을 해보니 input 배열에 3값만 들어간 후 바로 for문이 돌아가서 생긴 문제였다.

 

StringTokenizer는 입력 시 문자열을 공백 단위로 입력받을때 사용한다.

StringTokenizer st = new StringTokenizer(br.readLine()); 부분에서 이미 한줄 단위로 입력을 받고

st.nextToken() 사용 시 공백 단위로 입력을 받는다.

 

따라서 처음 공백단위로 입력받은 st값은 3 이므로 input배열에는 3의 값만 들어가는 것이다.

 

이 경우 split(" ")으로 공백 단위로 나눠 입력받고 있으므로 굳이 nextToken()을 사용할 필요가 없다.

 

한 줄 단위로 입력 받으면 된다.

 

따라서 다음과 같이 코드를 바꾸니 해결되었다.

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

public class baek_2675 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());
        
        for (int i = 1; i <= T; i++) {
            String[] input = br.readLine().split(" ");
            for(int j=0; j<input[1].length(); j++) {
                bw.write((input[1].charAt(j)+"").repeat(Integer.parseInt(input[0])));
            }
            //줄바꿈
            bw.write("\n");
        }
        br.close();
        bw.flush();
        bw.close();
    }

}

원하는 출력값을 얻을 수 있었다.

 

복사했습니다!