Step-by-Step

[Java / Scanner] nextInt() 후 nextLine() 본문

언어/JAVA

[Java / Scanner] nextInt() 후 nextLine()

희주(KHJ) 2021. 6. 9. 21:53

백준 문제들은 거의 Scanner를 통해 사용자의 입력을 받아서 처리하는 문제들이다

StringBuffer를 공부하다가 연습삼아 한 문제를 골라 풀어봤다! 바로 백준 9093번 단어 뒤집기 ~

마침 StringBuffer랑 StringTokenizer를 공부하고 있던 참이었으니 이용해보기로 했다

StringBuffer 두 개를 선언해서 하나는 최종 결과물로 내놓고

나머지는 그때그때 단어 순서를 바꾸는 용도로 쓰기로 결정했다

import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();	// 최종 결과물
		StringBuffer s = new StringBuffer();	// 글자 바꾸기용
		
		int n = sc.nextInt();
		
		for(int i=0;i<n;i++) {
			String str = sc.nextLine();	
			StringTokenizer st = new StringTokenizer(str);
			int num = st.countTokens();

			for(int j=0;j<num;j++) {				
				String tk = st.nextToken();
				s.append(tk);

				sb.append(s.reverse()).append(" ");
				s.setLength(0);		// 초기화
			}
			sb.setLength(sb.length()-1);	// 마지막에 공백 없애기
			sb.append("\n");	// 줄바꿈
		}
		
		sb.setLength(sb.length()-1);	// 마지막 개행문자 없애기
		System.out.println(sb);
	}
}

머릿 속에서 그려가면서 작성한 코드이다

나중에 "왜 이렇게 더럽게 짠거지!!" 하고 미래의 내가 욕할지도 모르지만 지금은 이게 최선..ㅠㅠ

그리고 나와야 하는 결과물

답을 제출하기 전에 이클립스를 통해 실행해 보았는데

2를 치고 엔터를 누르자마자 에러가 났다

코드를 아무리 읽어도 숫자가 들어온다고 시뮬레이션을 해도 문제가 없어보였다

사실 바로 인터넷에 검색해보면 되는데 갑자기 알 수 없는 근자감 +  하루종일 공부하느라 지친 마음 때문에

일단 이클립스가 일시적으로 고장났을거라고 합리화(?)를 하면서 답을 제출했다 

역시 컴퓨터는 거짓말을 하지 않는다 바로 런타임 에러가 발생하였다

혹시나 해서 2를 치고 바로 엔터를 누르지 않고 작성해보았다

그랬더니 성공하였다! 여기서 왜 첫 번째만 엔터가 안 되는지 인터넷에 검색해보았는데

nextInt()는 정수 값만 받고 뒤에 개행문자를 포함하지 않기 때문에 

다음줄 입력으로 넘어가기 위해서는 정수를 받는 줄의 개행문자를 제거한 후 다음 라인을 받아야 한다

따라서 nextInt() 사용 후에 nextLine()을 써서 개행문자를 없앤 후

그 다음부터 받으면 된다

import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();	// 최종 결과물
		StringBuffer s = new StringBuffer();	// 글자 바꾸기용
		
		int n = sc.nextInt();
		sc.nextLine();		// 개행문자 없애기
		for(int i=0;i<n;i++) {
			String str = sc.nextLine();	
			StringTokenizer st = new StringTokenizer(str);
			int num = st.countTokens();

			for(int j=0;j<num;j++) {				
				String tk = st.nextToken();
				s.append(tk);

				sb.append(s.reverse()).append(" ");
				s.setLength(0);

			}
			sb.setLength(sb.length()-1);	// 마지막에 공백 없애기
			sb.append("\n");	// 줄바꿈
		}
		
		sb.setLength(sb.length()-1);
		System.out.println(sb);
	}
}

코드는 한 줄만 잘못되어도 아예 다른 결과가 나오니까 항상 꼼꼼하게 확인하고 공부해야한다 (반성중)

결과는 성공!


혹시 몰라서 nextLine() 말고 next()로도 되나 확인해봤는데

개행문자 포함해서 다음 공백전까지의 단어도 없애버린다 잘 확인하자..!!

참조 : https://sleepyeyes.tistory.com/22

문제 추천 [백준 11729] : https://www.acmicpc.net/problem/9093

Comments