이 문제는 단순하게 string을 이용해서 split하고 단어를 뒤집어서 반복문을 돌리면 시간초과가 날 것이다. 이 문제는 문자열을 어떻게 효율적으로 다룰것인가 에 대한 문제인 것같다.
그래서 나는 stringbuffer를 이용해서 시간을 최대한으로 줄였다.import java.util.*; class Main { public static void main(String argv[]) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); for(int i=0;i<n;i++){ StringBuffer str = new StringBuffer(sc.nextLine()); str = str.reverse(); StringBuffer answer = new StringBuffer(""); StringBuffer tmp = new StringBuffer(""); int strLength = str.toString().length(); String[] strs = new String[strLength]; int count=0; for(int j=0;j<strLength;j++){ if(str.charAt(j)!=' '){ tmp.append(str.charAt(j)); } else{ strs[count++]=tmp.toString(); tmp = new StringBuffer(""); } } strs[count]=tmp.toString(); for(int j=count;j>=0;j--){ System.out.print(strs[j]+" "); } System.out.print("\n"); } } }
나의 풀이는 scanner를 이용해 문자열을 입력받았지만 scanner로 입력을 받으면 속도가 느려진다. 왜냐하면 버퍼를 이용하지 않고 키보드에서 입력받은 값 그대로를 전달하기 때문이다.
하지만 BufferedReader의 경우 버퍼를 사용하여 입력을 받기 때문에 속도가 빠르다. 따라서 입력 속도를 빠르게 하고 싶다면 BufferedReader를 사용하는 것이 좋다.import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); for(int t = 0; t < T; t++) { StringBuilder sb = new StringBuilder(); String[] arr = br.readLine().split(" "); for(int i = 0; i < arr.length; i++) { for(int j = arr[i].length() - 1; j >= 0; j--) { sb.append(arr[i].charAt(j)); } sb.append(" "); } System.out.println(sb); } } }BufferedReader 사용법
BufferedReader의 경우 scanner와 다르게 개행문자 만을 경계로 인식해 입력을 종료한다.(scanner의 경우 개행,띄어쓰기,탭)
BufferedReader 이름 = new BufferedReader(new InputStreamReader(System.in)); // 버퍼 객체 생성 이름.readLine()// 한줄 읽기 입력받은 문자열을 string으로 반환 이름.read() // 한글자 읽기 입력받은 문자를 int로 반환(이 int 값은 아스키코드값)
입력을 빠르게 하고 싶다면 BufferedReader를 이용하자.
문자열을 많이 다룰 예정이라면 stringbuffer나 stringbuilder를 사용하자