n, q = map(int, input().split())books = list(map(int, input().split()))queries = list(map(int, input().split()))for x in queries: lo, hi = 1, n # 아직 찾아볼 자리의 처음과 끝 seen = [] # 펼쳐 본 책 번호 answer = 0 while lo <= hi: mid = (lo + hi) // 2 # 몫만 남긴다 book = books[mid - 1] # mid번째 자리는 목록의 mid - 1번 칸 seen.append(book) if book == x: answer = mid break if book < x: lo = mid + 1 else: hi = mid - 1 print(*seen, answer)
JavaScriptmain.js · 25 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const [n, q] = lines[0].trim().split(/\s+/).map(Number);const books = lines[1].trim().split(/\s+/).map(Number);const queries = lines[2].trim().split(/\s+/).map(Number);const out = [];for (let k = 0; k < q; k++) { const x = queries[k]; let lo = 1, hi = n; // 아직 찾아볼 자리의 처음과 끝 const seen = []; // 펼쳐 본 책 번호 let answer = 0; while (lo <= hi) { const mid = Math.floor((lo + hi) / 2); // 몫만 남긴다 const book = books[mid - 1]; // mid번째 자리는 배열의 mid - 1번 칸 seen.push(book); if (book === x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } seen.push(answer); out.push(seen.join(" "));}console.log(out.join("\n"));
TypeScriptmain.ts · 26 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const [n, q]: number[] = lines[0].trim().split(/\s+/).map(Number);const books: number[] = lines[1].trim().split(/\s+/).map(Number);const queries: number[] = lines[2].trim().split(/\s+/).map(Number);const out: string[] = [];for (let k = 0; k < q; k++) { const x: number = queries[k]; let lo = 1, hi = n; // 아직 찾아볼 자리의 처음과 끝 const seen: number[] = []; // 펼쳐 본 책 번호 let answer = 0; while (lo <= hi) { const mid: number = Math.floor((lo + hi) / 2); // 몫만 남긴다 const book: number = books[mid - 1]; // mid번째 자리는 배열의 mid - 1번 칸 seen.push(book); if (book === x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } seen.push(answer); out.push(seen.join(" "));}console.log(out.join("\n"));
JavaMain.java · 29 行
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), q = sc.nextInt(); int[] books = new int[n]; for (int i = 0; i < n; i++) books[i] = sc.nextInt(); StringBuilder out = new StringBuilder(); for (int k = 0; k < q; k++) { int x = sc.nextInt(); int lo = 1, hi = n; // 아직 찾아볼 자리의 처음과 끝 int answer = 0; while (lo <= hi) { int mid = (lo + hi) / 2; // int끼리 나누면 몫만 남는다 int book = books[mid - 1]; // mid번째 자리는 배열의 mid - 1번 칸 out.append(book).append(' '); if (book == x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } out.append(answer).append('\n'); } System.out.print(out); }}
C#Main.cs · 37 行
using System;using System.Text;class Program{ static void Main() { string[] head = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int n = int.Parse(head[0]), q = int.Parse(head[1]); string[] bookParts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); string[] queryParts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int[] books = new int[n]; for (int i = 0; i < n; i++) books[i] = int.Parse(bookParts[i]); var sb = new StringBuilder(); for (int k = 0; k < q; k++) { int x = int.Parse(queryParts[k]); int lo = 1, hi = n; // 아직 찾아볼 자리의 처음과 끝 int answer = 0; while (lo <= hi) { int mid = (lo + hi) / 2; // int끼리 나누면 몫만 남는다 int book = books[mid - 1]; // mid번째 자리는 배열의 mid - 1번 칸 sb.Append(book).Append(' '); if (book == x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } sb.Append(answer).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 27 行
#include <iostream>#include <vector>int main() { int n, q; std::cin >> n >> q; std::vector<int> books(n); for (int i = 0; i < n; i++) std::cin >> books[i]; for (int k = 0; k < q; k++) { int x; std::cin >> x; int lo = 1, hi = n; // 아직 찾아볼 자리의 처음과 끝 int answer = 0; while (lo <= hi) { int mid = (lo + hi) / 2; // int끼리 나누면 몫만 남는다 int book = books[mid - 1]; // mid번째 자리는 vector의 mid - 1번 칸 std::cout << book << " "; if (book == x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } std::cout << answer << "\n"; }}
Cmain.c · 29 行
#include <stdio.h>int main(void) { int n, q; int books[100]; if (scanf("%d %d", &n, &q) != 2) return 0; for (int i = 0; i < n; i++) { if (scanf("%d", &books[i]) != 1) return 0; } for (int k = 0; k < q; k++) { int x; if (scanf("%d", &x) != 1) return 0; int lo = 1, hi = n; /* 아직 찾아볼 자리의 처음과 끝 */ int answer = 0; while (lo <= hi) { int mid = (lo + hi) / 2; /* int끼리 나누면 몫만 남는다 */ int book = books[mid - 1]; /* mid번째 자리는 배열의 mid - 1번 칸 */ printf("%d ", book); if (book == x) { answer = mid; break; } if (book < x) lo = mid + 1; else hi = mid - 1; } printf("%d\n", answer); } return 0;}
Craykonmain.cray · 32 行
head = コンソール.数読み();n = head[0];books = コンソール.数読み();queries = コンソール.数読み();それぞれ (x の中 queries){ lo = 1; // 아직 찾아볼 자리의 처음과 끝 hi = n; seen = []; // 펼쳐 본 책 번호 answer = 0; 間 (lo <= hi) { mid = 数学.商(lo + hi, 2); // 몫만 남긴다 book = books[mid - 1]; // mid번째 자리는 목록의 mid - 1번 칸 seen.追加(book); もし (book == x) { answer = mid; 抜ける; } もし (book < x) { lo = mid + 1; } でなければ { hi = mid - 1; } } seen.追加(answer); コンソール.書く(seen); // 목록은 빈칸으로 이어서 쓴다}