프로그래머스 백준 문제

백준 10816 숫자카드2

전한준 2025. 6. 16. 14:57
import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    static int arr[];
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        StringTokenizer st=new StringTokenizer(br.readLine()," ");
        arr=new int[N];
        for(int i=0;i<N;i++){
            arr[i]=Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        int M=Integer.parseInt(br.readLine());
        st=new StringTokenizer(br.readLine()," ");
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<M;i++){
            int key=Integer.parseInt(st.nextToken());
            sb.append(up(arr,key)-low(arr,key)).append(" ");
        }
        System.out.println(sb);
    }
    private static int up(int []arr,int key){
        int left=0;
        int right=arr.length;
        while(left<right){
            int mid=(left+right)/2;
            if(key<arr[mid]){
                right=mid;
            }
            else{
                left=mid+1;
            }
        }
        return right;
    }
        private static int low(int []arr,int key){
        int left=0;
        int right=arr.length;
        while(left<right){
            int mid=(left+right)/2;
            if(key<=arr[mid]){
                right=mid;
            }
            else{
                left=mid+1;
            }
      
        }
    return right;
        }
}

 

여기서 결국에 상한값은 찾으려는 값보다 < 를 넣으면 되고 

하한값은 찾으려는 값보다 <= 를 넣으면 된다. 

결국에 right를 움직여가지고 

left==right 가 같아지는 지점까지 맞추어준다. 

마지막에 left를 mid+1로 움직여서 right로 맞추어준다. 

 

Map 을이용해서 

map.getOrDefault(key,0) 이걸로 풀이를 한다. 

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    static int arr[];
    public static void main(String[] args) throws IOException {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    int n=Integer.parseInt(br.readLine());
    HashMap<Integer,Integer>map=new HashMap<>();
    StringTokenizer st=new StringTokenizer(br.readLine()," ");
    for(int i=0;i<n;i++){
        int key=Integer.parseInt(st.nextToken());
        map.put(key,map.getOrDefault(key,0)+1);
    }
        int M=Integer.parseInt(br.readLine());
          st=new StringTokenizer(br.readLine()," ");
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<M;i++){
            int target=Integer.parseInt(st.nextToken());
            sb.append(map.getOrDefault(target,0)).append(' ');
        }
        System.out.println(sb);
    }
}

 

 

 

[백준] 10816번 : 숫자 카드 2 - JAVA [자바]

 

[백준] 10816번 : 숫자 카드 2 - JAVA [자바]

https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드

st-lab.tistory.com

 

'프로그래머스 백준 문제' 카테고리의 다른 글

9935번 문자열 폭발  (2) 2025.06.19
백준 1920  (0) 2025.06.16
백준 이분탐색 2512  (0) 2025.06.16
2920  (0) 2024.09.19
2577  (0) 2024.09.02