관리 메뉴

100세까지 코딩

[do it 알고리즘] 백준 1940 (투 포인터2) 본문

코딩테스트/자바

[do it 알고리즘] 백준 1940 (투 포인터2)

100세까지 코딩 2023. 9. 24. 23:56
문제 설명

 

풀기 전 생각
  • 시간을 줄이기 위해 그전에 배운 BufferedReader 사용
  • 입력 받은 것을 잘라서 배열에 저장후 오름차순 정리
  • 투 포인터를 배열 처음(start_index)과 끝(end_index)에 두기
  • (arr[start] + arr[end] < M)이면 start++, (arr[start] + arr[end] > M)이면 end--
  • (arr[start] + arr[end] == M)이면 start++ 과 end-- 동시에 하고 cnt++
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Baek1940 {
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        int M = Integer.parseInt(bf.readLine());
        int[] arr = new int[N];
        StringTokenizer st =new StringTokenizer(bf.readLine());
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);

        int start_index = 0;
        int end_index = N-1;
        int cnt = 0;
        while(arr[start_index] < arr[end_index]){
            if(arr[start_index] +  arr[end_index] < M){
                start_index++;
            }else if(arr[start_index] +  arr[end_index] > M){
                end_index--;
            }else{
                start_index++;
                end_index--;
                cnt++;
            }
        }
        System.out.println(cnt);

    }
}
참고
 

[자바 공부] StringTokenizer

StringTokenizer 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스 주요 메서드 countTokens() 현재 남아있는 token 개수 hasMoreTokens() 남아있는 토큰이 있으면 true, 없으면 false nextToken() 객체에

sjd0219.tistory.com

 

[자바 공부] BufferedReader vs Scanner

한눈에 정리 BufferedReader Scanner 버퍼 사이즈(byte) 8192 1024 데이터 파싱 String으로 단순히 읽음 원하는 타입으로 파싱 예외 처리 IOException 던짐 IOException 숨김 Syncronized O X 속도 빠름 느림 1) Scanner 공백

sjd0219.tistory.com

모범답안과 나의 풀이가 같으니 좋다