반응형

현재 알고리즘 공부를 하고있는데 계속 시간초과가 나서 Scanner를 못쓰게 됐다...

앞으로 많은 문제들이 이러한 제약을 갖고있을 듯 하여 이제서야 공부하게 됐다.

https://spody.tistory.com/60

 

1920번 수 찾기 자바로 풀어 본 짧은 글

1920번 수 찾기 1920번: 수 찾기 (acmicpc.net) 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주

spody.tistory.com

정렬과 이분탐색 모두 사용하는데 시간도 얼마 없는 문제.... 여기서 막혀버렸다

때문에 공부 조금 하고 정리할 겸 올리는 글....

사전준비

1
2
3
4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
cs
1
public static void main(String[] args) throws NumberFormatException, IOException{
cs

main에는 이렇게 IOExcption을 해줘야한다.

BufferedReader는 Scanner에 비해서 속도가 훨씬 빠르다.

이유는 입력된 데이터가 버퍼를 거쳐 전달돼서 데이터 처리 효율이 올라간다.

때문에 데이터가 많이 들어갈 때는 이 클래스를 활용해서 해결해야한다.

또 StringTokenizer를 사용하는 이유는 BufferedReader는 한 줄씩 입력을 받는 readLine을 사용하게 되는데

"10 5 3 1 10" 등 값을 띄어쓰기로 구분 해 입력받는다 이러한 한 줄을 처리하기 위해 String을 token간격으로 끊어 사용한다는 의미의

StringTokenizer를 사용해 해당 값을 처리해준다.

기본적으로 StringTokenizer을 사용하면 띄어쓰기 별로 10 5 3 1 10 이 값에서 nextToken()메소드를 사용할 때마다

순차적으로 꺼낸다.

ex)

1
2
3
4
5
6
7
8
9
10
11
import java.io.BufferedReader;
 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] a = new int[n];
 
StringTokenizer st = new StringTokenizer(br.readLine());
 
for(int i = 0; i < n; i++) {
    a[i] = Integer.parseInt(st.nextToken());
}
cs

input : 5

           10 5 3 1 10

이 경우

a[0] = token(10)

a[1] = token(5)

a[2] = token(3)

a[3] = token(1)

a[4] = token(10)

이런 식이다.

형태를 잘 기억해두자.

 

반응형
반응형

nextint() 입력 후 nextLine()을 사용 시에 입력관련 오류가 생긴다.

 

이유는 콘솔 입력시에 엔터키를 입력 했을 때만 지금까지 눌렀던 내용이 버퍼에 전달되어 저장이 되는데, nextInt의 메서드

는 int값만 가져간 후 구분자를 받지 않는다.

때문에 이후 \n의 구분자를 통해 입력을 구분하는 nextLine메서드를 사용할 경우 해당 부분에서 문제가 생긴다. nextLine의 첫번째 입력을''\n의 상태로 입력을 받는 것이다.

 

아래는 해당 부분의 코드 예제이다.

1
2
3
4
5
6
7
8
9
        Scanner sc = new Scanner(System.in);
        int n;
        n = sc.nextInt();
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

이러한 오류를 해결할 방법은 알아본 바로는 두가지가 있는데,

 

첫번째는 

1
2
3
4
5
6
7
8
9
10
        Scanner sc = new Scanner(System.in);
        int n;
        n = sc.nextInt();
        sc.nextLine();//해당부분 줄     
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

이렇게 nextLine()을 한줄 추가해서 방지하는 것과

 

 

1
2
3
4
5
6
7
8
9
        Scanner sc = new Scanner(System.in);
        int n;
        n = n = Integer.parseInt(sc.nextLine());//nextLine을 사용해서 int형식 
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

위와 같이 아예 nextLine()을 통해 int형을 입력받는 방법이다.

 

가장 깔끔한 방법은 두번째 방법인 듯 하다.

 

문제풀다가 멘붕와서 서치한 내용을 토대로 정리 완!

 

요약 : nextInt에는 \n의 개행문자가 들어가지 않음. 때문에 다음 nextLine사용 시 해당 enter(\n)구분자를 가져가기에
nextLine을 바로 아랫줄에 넣어 초기화 시켜주거나 Integer.parseInt(sc.nextLine());의 형식으로 입력을 받아야 함

반응형

'공부 > Java' 카테고리의 다른 글

우테코 프리코스 6기 1주차 숫자야구 회고  (0) 2023.10.26
자바의정석 ch14 람다와 스트림  (0) 2023.09.18
BufferedReader, StringTokenizer  (0) 2023.01.14

+ Recent posts