티스토리 뷰
구간의 합집합 (union.cpp)
문제
구간은 [s, e] 로 나타내고, 이 의미는 s, (s+1), (s+2), …, (e-1), e 와 같이 숫자를 나열한 것을 의미한다. 예를 들어, [1, 4]는 1, 2, 3, 4로 숫자를 나열한 것을 의미한다. n개의 구간이 있고, 이 구간들의 숫자를 모두다 새로운 배열 S에 넣어 정렬을 한다. 이 때 S[i] 의 값이 무엇인지 출력하는 프로그램을 작성하시오. 예를 들어, 3개의 구간 [1, 3], [2, 10], [1, 8] 이 있고, S[5]를 알고싶다고 하자. 그러면 S = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10] 이 되고, 따라서 S[5]는 3이 된다. 배열의 인덱스는 0부터 시작한다는 것에 주의하자.
입력
첫 번째 줄에 구간의 개수 n이 주어진다 ( 1 ≤ n ≤ 10,000 ) 두 번째 줄부터 각 구간을 나타내는 숫자 s, e가 주어진다. ( 1 ≤ s ≤ e ≤ 1,000,000,000 ) 그 후, 마지막 줄에는 값을 알고 싶은 숫자의 위치 i가 주어진다. ( 1 ≤ i ≤ 10,000,000,000,000 ) i번째 위치에는 항상 숫자가 존재한다고 가정한다.
출력
S[i]를 출력한다.
예제 입력
2
1 4
3 5
3
예제 출력
3
예제 입력
3
1 3
2 10
1 8
5
예제 출력
3
코드
///구간의 합집합
import java.util.*;
public class Main {
public static ArrayList<Integer> box = new ArrayList<>();
public static long finalResult = 0;
// public static long max = Integer.MIN_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
long b[][];
long c;
int d[];
int count = 0;
long max = Integer.MIN_VALUE;
a = sc.nextInt();
b = new long[a][2];
for (int i = 0; i < a; i++) {
b[i][0] = sc.nextLong();
b[i][1] = sc.nextLong();
if (max < b[i][1]) max = b[i][1];
}
c = sc.nextLong();
countN(0, Long.MAX_VALUE, b, c);
System.out.println(finalResult);
sc.close();
}
public static int findN(long[][] b, long k, long target, boolean x) {
long result = 0;
for (int i = 0; i < b.length; i++) {
long left = b[i][0];
long right = b[i][1];
if (right < k) result += right - left + 1;
else if (right >= k && left <= k) result += k - left;
}
if (x && result == target && findN(b, k + 1, target, false) == 0 && findN(b, k - 1, target, false) == -1)
return 1;
else if (result > target) return 0;
else if (x && result < target && findN(b, k + 1, target, false) == 0) return 1;
else return -1;
}
public static void countN(long s, long e, long[][] b, long target) {
if (s > e) return;
else {
long mid = (s + e) / 2;
int result = findN(b, mid, target, true);
if (result == 1) finalResult = mid;
else if (result == 0) countN(s, mid - 1, b, target);
else {
countN(mid + 1, e, b, target);
}
}
}
}
'알고리즘 문제 풀이 ' 카테고리의 다른 글
제곱수의 합 (0) | 2018.10.11 |
---|---|
직사각형 배치의 경우의 수 (0) | 2018.10.10 |
구슬게임 (0) | 2018.10.05 |
직사각형의 합 (0) | 2018.10.05 |
숫자 만들기 (0) | 2018.10.05 |
2차식의 합 (0) | 2018.10.04 |
숫자개수 세기 (0) | 2018.10.04 |
두용액 (0) | 2018.10.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Terminal
- java #백준 #알고리즘 #2805 #나무자르기
- Game
- javascript #백준 #알고리즘 #LCS
- java #알고리즘 #백준 #퇴사
- javascript #연속합 #알고리즘 #백준
- 1992번
- java #하노이 #알고리즘 #백준
- npm
- react
- 색종이자르기
- webpack
- java #백준 #알고리즘 #로또 #6603
- 쿼드트리
- 중간거리 #야만나 #약속장소추천 #중간위치 #웹 #리액트 #React #reactjs #kakao지도 #kakaoapi
- 2630번
- java #알고리즘 #백준 #N과M #백트래킹
- TypeScript
- webspider
- javascript #백준 #회의실배정 #알고리즘
- 알고리즘
- java #오르막수 #백준 #알고리즘
- java #알고리즘 #백준 #패션왕신해빈
- 백준 #알고리즘 #전깃줄 #NodeJs #javascript
- 한글 자동 완성
- 백준
- Javascript
- java #퀵소트 #quicksort #알고리즘 #백준
- java #알고리즘 #백준
- 백준 #java #알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
글 보관함