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 |