【白俊アルゴリズム】10815号:デジタルカード
12675 ワード
質問する
デジタルカードは整数と書かれたカードです.尚根にはN枚のデジタルカードがあります.整数M個を指定した場合は、前のルートにその数が書かれたデジタルカードがあるかどうかを判断するプログラムを作成します.
入力
1行目には、上位のデジタルカードの個数N(1≦N≦500000)が与えられる.2行目には、数値カードの整数が表示されます.デジタルカードに書かれている数字は-1000000以上、1000000未満です.2枚の数字カードに同じ数字はありません.
3行目はM(1≦M≦500000)を与える.4行目には、上のルートに数値カードがあるかどうかを求めるためにスペースで区切られたM個の整数が与えられます.この数-1000000以上、1000000未満です.
しゅつりょく
最初の行に入力されたM個の数値について、上のルートに各数値が書かれた数値カードがある場合は、1、または0をスペースで区切って出力します.
コード#コード#
二分探索を用いた.
最小値が最大値以下の場合、文をループします.
中間インデックスを求めた後に、中間インデックスの値を求めます
必要な数値が中間インデックスより小さい場合は、最大値に「中間値-1」を格納し、検索範囲を縮小します.
必要な数値が中間インデックスより大きい場合は、最小値に「中間値+1」を格納し、検索範囲を縮小します.
要求された数字が中間インデックスと同じ場合、正しい答えが求められたためtrueが返されます.
参考資料
デジタルカードは整数と書かれたカードです.尚根にはN枚のデジタルカードがあります.整数M個を指定した場合は、前のルートにその数が書かれたデジタルカードがあるかどうかを判断するプログラムを作成します.
入力
1行目には、上位のデジタルカードの個数N(1≦N≦500000)が与えられる.2行目には、数値カードの整数が表示されます.デジタルカードに書かれている数字は-1000000以上、1000000未満です.2枚の数字カードに同じ数字はありません.
3行目はM(1≦M≦500000)を与える.4行目には、上のルートに数値カードがあるかどうかを求めるためにスペースで区切られたM個の整数が与えられます.この数-1000000以上、1000000未満です.
しゅつりょく
最初の行に入力されたM個の数値について、上のルートに各数値が書かれた数値カードがある場合は、1、または0をスペースで区切って出力します.
コード#コード#
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BOJ_10815 {
static int N;
static int[] cards;
static int M;
static int[] haveCards;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
cards = new int[N];
String[] input1 = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
cards[i] = Integer.parseInt(input1[i]);
}
Arrays.sort(cards);
M = Integer.parseInt(br.readLine());
haveCards = new int[M];
String[] input2 = br.readLine().split(" ");
for (int i = 0; i < M; i++) {
haveCards[i] = Integer.parseInt(input2[i]);
if (binarySearch(haveCards[i])) System.out.print("1 ");
else System.out.print("0 ");
}
}
public static boolean binarySearch(int num) {
int minIndex = 0;
int maxIndex = N - 1;
while (minIndex <= maxIndex) {
int middleIndex = (minIndex + maxIndex) / 2;
int middleNum = cards[middleIndex];
if (num < middleNum) maxIndex = middleIndex - 1;
else if (num > middleNum) minIndex = middleIndex + 1;
else return true;
}
return false;
}
}
答えと感じ二分探索を用いた.
最小値が最大値以下の場合、文をループします.
中間インデックスを求めた後に、中間インデックスの値を求めます
必要な数値が中間インデックスより小さい場合は、最大値に「中間値-1」を格納し、検索範囲を縮小します.
必要な数値が中間インデックスより大きい場合は、最小値に「中間値+1」を格納し、検索範囲を縮小します.
要求された数字が中間インデックスと同じ場合、正しい答えが求められたためtrueが返されます.
参考資料
Reference
この問題について(【白俊アルゴリズム】10815号:デジタルカード), 我々は、より多くの情報をここで見つけました https://velog.io/@doeunllee/백준-알고리즘-10815번-숫자-카드テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol