백준 5427 불

2022. 12. 4. 15:31코딩 공부 연습

반응형

이번에는 지금까지 scanner 의 readInt 으로만 입력을 하던 내 방식에서 문제를 찾을 수 있었다.

 

for (int i = 0; i < tc; i++) {
    int w, h;
    w =  scanner.nextInt();
    h = scanner.nextInt();

    for (int j = 0; j < h; j++) {
        String tmp = scanner.nextLine();
        System.out.println(tmp);
    }

초기에 이렇게 작성하고 돌렸는데 에러가 났다. 정확히는 string exception 이었는데, ####을 입력도 하지않았는데 개행이 하나 입력이 되어 스트링 길이를 초과하는 인덱스를 참조했다는 거였다. 

보니까 개행하나가 자동으로 중간에 들어가고, 그걸 nextLine이 잡고있다. 이는 scanner 로 nextIne 와 nextLine을 함께 사용했을 때 어쩔수 없이 발생하는 문제라고 한다.

https://gongstudyit.tistory.com/18

 

[Java] nextInt( )사용 후 nextLine( ) 사용법

-Scanner.nextInt 메소드는 -->가장 마지막 개행문자(엔터,newline)을 제거하지않는다. 개행문자(엔터)전까지만 숫자로 입력받음. -->이부분에서 문제가 생김 nextInt( )와 nextLine( )을 사용시 넥스트인트에

gongstudyit.tistory.com

많이 배웠다. nextInt 는 숫자 입력후 엔터를 없애주지 않기 때문에 바로 readLine 시 읽는다는 것이다.

 

int w =  scanner.nextInt();
int h = scanner.nextInt();
String tmp2 = scanner.nextLine();

for (int j = 0; j < h; j++) {
    String tmp = scanner.nextLine();
    System.out.println(tmp);
}

이렇게 tmp2 로 개행을 받아주는 nextLine 을 해주면 문제를 피하기 가능하다.

 

아니면 전부다 nextLine으로 받고 parseInt 로 숫자로 바꿔주는 방법도 있다.

 

int tc = Integer.parseInt(scanner.nextLine());

for (int i = 0; i < tc; i++) {
    int w =  Integer.parseInt(scanner.nextLine());
    int h = Integer.parseInt(scanner.nextLine());

    for (int j = 0; j < h; j++) {
        String tmp = scanner.nextLine();
        System.out.println(tmp);
    }
}

이렇게!

 

여기서 Stringtokenizer 를 이용해 "4 3" 으로 들어온 문자열을 분리해 각자 저장해 줄 수도 있다. 이렇게 하는게 좋다.

 

int tc = Integer.parseInt(scanner.nextLine());
for (int i = 0; i < tc; i++) {
    StringTokenizer st = new StringTokenizer(scanner.nextLine());
    int w = Integer.parseInt(st.nextToken());
    int h = Integer.parseInt(st.nextToken());

    for (int j = 0; j < h; j++) {
        String tmp = scanner.nextLine();
        System.out.println(tmp);
    }
}

이렇게!!!!

 

stringtokenizer 클래스는 문자열을 나누어 주는 역할을 하는데, 인자가 없으면자동으로 띄어쓰기를 기준으로 해주고, 오버로딩 되어 있어 인자가 2개일 경우 두번째 인자를 기준으로 나누어 준다는 사실을 알 수 있었다. 종종 써먹을 수 있을 것 같다.

 

꽤 좋은걸 배울 수 있는 하루였다ㅎ 

'코딩 공부 연습' 카테고리의 다른 글

백준 2667 단지번호붙이기  (0) 2022.12.07
백준 2583 영역 구하기  (0) 2022.12.05
백준 7576 토마토  (0) 2022.11.28
백준 2606 바이러스  (0) 2022.11.26
백준 15894 수학은 체육과목 입니다.  (0) 2022.10.28