알고리즘/코드트리 문제풀이

코드트리 [자바 java] 점 개수 세기 3

잔디🌿 2023. 8. 23. 01:19

https://www.codetree.ai/missions/8/problems/count-number-of-points-3?utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

점의 위치가 주어지고, 특정 범위가 주어지면 그 사이에 있는 점들의 갯수를 출력하는 문제이다.

범위만큼의 배열을 만들고, 브루트포스로 하나하나 탐색해가는 방법도 물론 존재하지만, 이렇게 하면 시간이 오래 걸린다. 그래서 이 문제에서 사용한 방법은 좌표압축이다.

 

Arrays.sort를 이용해서 입력받은 점들의 위치를 정렬했고, 이들의 수와 index값을 묶어서 HashMap에 저장했다. 

그 다음 범위가 하나씩 입력될 때마다 그 범위에 해당하는 index값을 받아 start값과 end값의 차이를 빼서 두 점 사이에 있는 점들의 갯수를 출력하도록 했다.

 

import java.io.*;
import java.util.*;
import java.math.*;


public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];

        st = new StringTokenizer(br.readLine());

        for(int i = 0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        HashMap<Integer,Integer> hash = new HashMap<>();

        //정렬

        Arrays.sort(arr);

        //점 위치별 번호 매기기


        for(int i = 0;i<n;i++){
            hash.put(arr[i],i);
        }

        for(int i = 0;i<m;i++){
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            //입력받은 점들의 사이에 있는 점 수 출력


            System.out.println(Math.abs(hash.get(s) - hash.get(e))+1);


        }

    }
}