백준에서 알고리즘 문제 풀이 중에 입력값 처리에 문제가 발생했다.
문제에서 던져주는 입력값을 readLine()
으로 받을 수 없어 계속 컴파일 에러가 발생했다.
구글링한 결과 readLine()
의 경우, 아래와 같은 공백 구분이 불가능한 듯하다. 아님 말고
[input]
1 2
Scanner
와 Buffereader
에 대해 정리 해보려 한다.입력값을 받는 클래스
Scanner
와 Buffereader
둘 다 입력 처리 클래스이다.
이 둘의 가장 큰 차이점은 바로 속도
다.
이름 | 내용 |
---|---|
Scanner | 입력을 받는 즉시 처리 |
Buffereader | 입력을 버퍼에 모아 특정 타이밍에 처리 |
때문에 Buffereader
쪽의 처리 속도가 더 빠르다.
그 외의 중요한 특징들은 아래 [참고 사이트]로
🔎 [참고 사이트]
fun main(args:Array<String>) {
val sc = Scanner(System.`in`)
val name = sc.nextLine()
val age = sc.nextInt()
println("name: $name, age: $age")
}
fun main(args: Array<String>) = with(Scanner(System.`in`)) {
val name = nextLine()
val age = nextInt()
println("name: $name, age: $age")
}
fun main(args:Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val name = br.readLine()
val age = br.readLine().toInt()
println("name: $name, age: $age")
}
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val name = readLine()
val age = readLine().toInt()
println("name: $name, age: $age")
}
Scanner는 nextInt(), nextDouble() 등으로 공백 구분과 동시에 자료형 지정도 가능하다.
그러나 Buffereader는 readLine()만 사용할 수 있고, 이는 무조건 입력값을 String 자료형으로 받는다.
따라서 필요 시에 형변환이 요구되며 공백 구분을 할 수 없다.
즉, 띄어쓰기된 Integer를 가공하기 위해서는 StringTokenizer
를 사용해야 한다.
지정한 구분자로 문자열을 쪼개주는 클래스
[input] 10 20 30 40 50
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val arr = ArrayList<Int>()
val st = StringTokenizer(readLine())
while (st.hasMoreTokens()) {
arr.add(st.nextToken().toInt())
}
println("Contents Of an Array: $arr")
}
output: Contents Of Array: [10, 20, 30, 40, 50]
이름 | 내용 |
---|---|
StringTokenizer(String str) | 문자열을 기본(default) delim으로 분리, 기본 delimiter는 공백 문자들인 " \t\n\r\t"을 의미한다. |
StringTokenizer(String str, String delim) | 지정 delim으로 문자열 분리 |
StringTokenizer(String str, String delim,boolean returnDelims) | 지정 delim으로 분리 + delim까지 token으로 포함, returnDelims가 true/포함, false/불포함 |
- 남아있는 token 개수를 반환, 전체 token 개수가 아닌 현재 남아있는 token 개수를 반환한다.
- 사용할 수 있는 토큰이 남아있는 경우 true 를 반환.
- 더 이상 사용할 토큰이 남아있지 않은 경우 false 를 반환.
- 확인 결과만 반환할 뿐 실제 내용을 읽어들이는 헤드(▼)를 이동시키지 않는다.
- 두가지 메소드는 모두 같은 값을 반환한다.
- 두가지 메소드 모두 반환형만 다른, 같은 객체를 반환.
- 다음 토큰을 얻어오며 헤드(▼)를 이동시킨다.
- 구분자를 변경하여도 다음 호출 시에 바뀐 구분자를 이용하여 토큰을 분리한다.
🔎 [참고 사이트]