PS/BOJ

10815

easy16 2022. 5. 7. 15:18

숫자카드 : https://www.acmicpc.net/problem/10815

 

입력이 1천만 정도로 int의 최고값에 미치지 못하므로 넉넉한 메모리를 활용하여

간단하게 풀이 가능함. 

시간 676ms 

메모리 : 153,368KB => boolean 배열을 활용하는데 20MB를 사용함

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.*;

public class Main {

	static int N, M;
	static boolean DBG = false;	
	static boolean[] ar;
	static int MAX = 10000000;

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

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

		N = Integer.parseInt(br.readLine());

		ar = new boolean[2 * MAX + 1];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			ar[Integer.parseInt(st.nextToken()) + MAX] = true;
		}

		M = Integer.parseInt(br.readLine());
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < M; i++) {
			sb.append(ar[Integer.parseInt(st.nextToken()) + MAX] ? 1 : 0).append(' ');
		}

		System.out.println(sb);

	}

}

 

 

이문제가 이분탐색의 항목에 있는 이유를 몰라 검색을 해보니..

아래와 같은 방식으로 코드를 구현해 놓은게 있다.

 

https://dragon-h.tistory.com/30

 

이진 탐색을 통한 포함 유무 확인 방법 

시간: 1048ms

메모리 : 135,300KB

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;

public class Main {

	static int N, M;
	static boolean DBG = false;
	static int[] arr;

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		N = Integer.parseInt(br.readLine());

		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);
		
		M = Integer.parseInt(br.readLine());
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < M; i++) {
			boolean res = binarySearch(arr, Integer.parseInt(st.nextToken()));
			bw.write(res ? "1 " : "0 ");
		}

		br.close();
		bw.close();

	}

	static boolean binarySearch(int[] list, int target) {
		int lt = 0;
		int rt = list.length - 1;
		boolean result = false;
		while (lt <= rt) {
			int mid = (rt + lt) / 2;
			if (list[mid] > target) {
				rt = mid - 1;
			} else if (list[mid] < target) {
				lt = mid + 1;
			} else {
				result = true;
				break;
			}

		}
		return result;
	}

}