1940 주몽 ⬛

kkmdevel·2024년 10월 7일

코딩테스트

목록 보기
16/21

📋문제 정리

  • 배열을 입력받아 배열의 두 숫자의 합이 M인 경우의 수를 구해라

🎯풀이

  • 두 포인터 사이의 숫자를 구하는게 아닌 포인터의 숫자의 합을 구하면된다.
  • L포인터는 0 , R포인터는 n-1부터 시작한다.
  • 둘의 합이 m보다 크면 R-- , 작으면 L++를 하면된다.
  • L이 R이상이 됐을때 종료한다.

배열을 꼭 오름차순으로 정렬 한 후 실시한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Arrays; 

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int m = Integer.parseInt(st.nextToken());
        int arr[] = new int[n];
        int start = 0;
        int end = n-1;
        int cnt = 0;

        st = new StringTokenizer(br.readLine());
        for(int i=0;i<n;i++) // 배열 초기화
          arr[i] = Integer.parseInt(st.nextToken());
        
        Arrays.sort(arr); // 오름차순 정렬 필수
        
        while(true){ // 두포인터 알고리즘
          int sum = arr[start] + arr[end];
          if(start>=end) break; // 반복문 끝나는 조건
          
          if(sum >m){
            end--;
          }
          else if(sum <m){
            start++;
          }
          else{
            cnt++;
            start++;
          }
        }
        sb.append(cnt);


        System.out.println(sb);
        br.close();
    }
}

profile
25/08/12

0개의 댓글