Programming/CondingTest

JAVA - 숫자카드 (백준, 10815)

긍정왕웹서퍼 2022. 8. 19. 00:27
728x90

문제

문제의 요구사항은 결국 길이 (갯수)N 의 카드와 길이 (갯수)M 의 카드를 비교해 일치하는 index 는 1 아니면 0을 출력한다.

 

맨처음엔 이분탐색 문제인지도 모르고 그냥 단순히 완전탐색으로 찾으려고만 했다..

 

import java.util.*;

public class main {
    
    public void card() {
        List<Integer> aList = new ArrayList<>();
        List<Integer> bList = new ArrayList<>();
        String result = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
        for(int i=0; i<n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int s = Integer.parseInt(st.nextToken());
            aList.add(s);
        }
        
        int m = Integer.parseInt(br.readLine());
        for(int i=0; i<m; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int s = Integer.parseInt(st.nextToken());
            bList.add(s);
        }
        
        for(int i =0; i<bList.size(); i++){
            for(int j=0; j<aList.size(); j++){
                if(bList.get(i) == aList.get(j)) {
                result += (" "+(String)bList.get(i));                    
                }
            }
        }
        System.out.println(result);
        
    }
    
    
}

졸려서 그랬나...?  부끄럽지만 말도안되는 코드로 정답역시 엉터리로 제출하려고 했다.

그러다가 문제를 차근차근 읽어보니, 이분탐색을 해야하고, 정답도 1 과 0 으로 출력해야하는걸 다시 알고 후다닥 고쳤다..

 

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

public class Main {
    
    public static void main(String[] args) throws IOException {
        

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        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 s = Integer.parseInt(st.nextToken());
            sb.append(upper(arr,s) - lower(arr,s)).append(' ');
        }
     
        System.out.println(sb);
        
    }
    
    private static int lower(int[] arr, int key) {
        int low = 0;
        int hi = arr.length;
        while(low < hi) {
            int mid = (low+hi)/2;
            if(key<=arr[mid]) {
                hi = mid;
            } else {
                low = mid + 1;
            }
        }
        return low;
    }
    
    private static int upper(int[] arr, int key) {
        int low = 0;
        int hi = arr.length;
        while(low<hi) {
            int mid = (low+hi)/2;
            if(key<arr[mid]){
                hi=mid;
            } else {
                low=mid+1;
            }
        }
        return low;
    }
    
}

그래도 생각보다 안되네.. 싶어서 결국 구글링 찬스... 정답코드들을 보고 정리해 보았다.

 

arr[] = N만큼의 길이를 가진 배열로 선언하고, StringTokenizer 로 이를 배열에 담는다.

그리고 Arrays.sord(arr) 로 배열을 정렬한다.

M 역시 똑같이 StringTokenizer 로 담는데, StringBuilder 에 담을 때, 이분탐색함수 lower, upper 로 배열을 탐색해 담는다.

 

어떻게 보면 쉽다고 생각하고 풀었지만, 아직 어렵다.. 자료구조와 알고리즘에 내가 얼마나 무지한상태인지 부끄럽지만..

남겨본다.