Skip to content

Commit 4079ebe

Browse files
committed
[Silver III] Title: 선분 위의 점, Time: 444 ms, Memory: 53000 KB -BaekjoonHub
1 parent a1b7fce commit 4079ebe

2 files changed

Lines changed: 85 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# [Silver III] 선분 위의 점 - 11663
2+
3+
[문제 링크](https://www.acmicpc.net/problem/11663)
4+
5+
### 성능 요약
6+
7+
메모리: 53000 KB, 시간: 444 ms
8+
9+
### 분류
10+
11+
정렬, 이분 탐색
12+
13+
### 제출 일자
14+
15+
2026년 2월 24일 22:12:54
16+
17+
### 문제 설명
18+
19+
<p>일차원 좌표상의 점 N개와 선분 M개가 주어진다. 이때, 각각의 선분 위에 입력으로 주어진 점이 몇 개 있는지 구하는 프로그램을 작성하시오.</p>
20+
21+
### 입력
22+
23+
<p>첫째 줄에 점의 개수 N과 선분의 개수 M이 주어진다. (1 ≤ N, M ≤ 100,000) 둘째 줄에는 점의 좌표가 주어진다. 두 점이 같은 좌표를 가지는 경우는 없다. 셋째 줄부터 M개의 줄에는 선분의 시작점과 끝점이 주어진다. 입력으로 주어지는 모든 좌표는 1,000,000,000보다 작거나 같은 자연수이다.</p>
24+
25+
### 출력
26+
27+
<p>입력으로 주어진 각각의 선분 마다, 선분 위에 입력으로 주어진 점이 몇 개 있는지 출력한다.</p>
28+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// /dev/stdin
2+
const fs = require("fs");
3+
let input = fs
4+
.readFileSync("/dev/stdin")
5+
.toString()
6+
.split("\n")
7+
.map((x) => x.replace("\r", ""));
8+
9+
const [N, M] = input[0].split(" ").map(Number);
10+
const points = input[1]
11+
.split(" ")
12+
.map(Number)
13+
.sort((a, b) => a - b);
14+
const answer = [];
15+
for (let i = 2; i < M + 2; i++) {
16+
const [x1, x2] = input[i].split(" ").map(Number);
17+
18+
const lower = lowerBound(points, x1);
19+
const upper = upperBound(points, x2);
20+
21+
answer.push(upper - lower);
22+
}
23+
24+
console.log(answer.join("\n"));
25+
26+
function lowerBound(arr, target) {
27+
let left = 0;
28+
let right = arr.length;
29+
30+
while (left < right) {
31+
const mid = Math.floor((left + right) / 2);
32+
if (target <= arr[mid]) {
33+
right = mid;
34+
} else {
35+
left = mid + 1;
36+
}
37+
}
38+
39+
return left;
40+
}
41+
42+
function upperBound(arr, target) {
43+
let left = 0;
44+
let right = arr.length;
45+
46+
while (left < right) {
47+
const mid = Math.floor((left + right) / 2);
48+
49+
if (target < arr[mid]) {
50+
right = mid;
51+
} else {
52+
left = mid + 1;
53+
}
54+
}
55+
56+
return left;
57+
}

0 commit comments

Comments
 (0)