Skip to content

Commit b358b59

Browse files
authored
Merge pull request #82 from developHeo515/junsu
2 parents 03ffa00 + 41af92c commit b358b59

File tree

13 files changed

+761
-0
lines changed

13 files changed

+761
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//BOJ10815 숫자 카드, 실버5
2+
//그냥 반복문인 arr.contains(num)를 사용하면 시간초과가 난다.
3+
//이분 탐색을 사용(재귀로 구현)
4+
import java.io.*;
5+
import java.util.*;
6+
7+
public class BOJ10815 {
8+
static int[] arr;
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
12+
StringTokenizer st;
13+
14+
int N = Integer.parseInt(br.readLine());
15+
arr = new int[N];
16+
17+
st = new StringTokenizer(br.readLine());
18+
for(int i = 0; i < N; i++) {
19+
int num = Integer.parseInt(st.nextToken());
20+
arr[i] = num;
21+
}
22+
23+
Arrays.sort(arr);
24+
25+
// for(int cur : arr) {
26+
// System.out.print(cur + " ");
27+
// }
28+
// System.out.println();
29+
30+
int M = Integer.parseInt(br.readLine());
31+
st = new StringTokenizer(br.readLine());
32+
for(int i = 0; i < M; i++) {
33+
int num = Integer.parseInt(st.nextToken());
34+
// arr.contains(num)를 사용하면 시간초과가 난다.
35+
int start = 0;
36+
int end = arr.length-1; //여기서 -1 안 빼주면 index 에러 발생한다.
37+
38+
int ans = BinarySearch(start, end, num);
39+
bw.write(ans + " ");
40+
}
41+
bw.flush();
42+
bw.close();
43+
br.close();
44+
}
45+
static int BinarySearch(int start, int end, int num) {
46+
if(start > end) return 0;
47+
int mid = (start + end) / 2;
48+
49+
if(arr[mid] == num) {
50+
return 1;
51+
}else if(arr[mid] < num) {
52+
return BinarySearch(mid+1, end, num);
53+
}else { //arr[mid] > num
54+
return BinarySearch(start, mid-1, num);
55+
}
56+
}
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//BOJ11279 최대 힙, 실버2
2+
//우선순위 큐를 사용하는 문제
3+
//new PriorityQueue<>() 에 Collections.reverseOrder() 를 사용
4+
import java.io.*;
5+
import java.util.*;
6+
7+
public class BOJ11279 {
8+
public static void main(String[] args) throws IOException {
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
11+
12+
int N = Integer.parseInt(br.readLine());
13+
//우선순위 조건을 내림차순으로 변경
14+
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
15+
16+
for(int i = 0; i < N; i++) {
17+
int num = Integer.parseInt(br.readLine());
18+
if(num == 0) {
19+
if(!pq.isEmpty()) {
20+
bw.write(pq.poll()+"\n");
21+
}else {
22+
bw.write(0 + "\n");
23+
}
24+
}else {
25+
pq.add(num);
26+
}
27+
}
28+
29+
bw.flush();
30+
bw.close();
31+
br.close();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//BOJ11286 절대값 힙, 실버1
2+
//우선순위 큐를 사용하는 문제
3+
//Comparator를 생성해야 하는 문제
4+
//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
5+
//Comparable은 "자기 자신과 매개변수 객체를 비교"하는 것이고,
6+
//Comparator는 "두 매개변수 객체를 비교"
7+
import java.io.*;
8+
import java.util.*;
9+
10+
public class BOJ11286 {
11+
public static void main(String[] args) throws IOException {
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
14+
15+
int N = Integer.parseInt(br.readLine());
16+
//우선순위 조건을 내림차순으로 변경
17+
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
18+
@Override
19+
public int compare(Integer o1, Integer o2) {
20+
if(Math.abs(o1) > Math.abs(o2)) {
21+
return 1;
22+
} else if(Math.abs(o1) < Math.abs(o2)) {
23+
return -1;
24+
} else {
25+
if(o1 > o2) {
26+
return 1;
27+
}else {
28+
return -1;
29+
}
30+
}
31+
}
32+
});
33+
34+
for(int i = 0; i < N; i++) {
35+
int num = Integer.parseInt(br.readLine());
36+
if(num == 0) {
37+
if(!pq.isEmpty()) {
38+
bw.write(pq.poll()+"\n");
39+
}else {
40+
bw.write(0 + "\n");
41+
}
42+
}else {
43+
pq.add(num);
44+
}
45+
}
46+
47+
bw.flush();
48+
bw.close();
49+
br.close();
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//BOJ11403 경로 찾기, 실버1
2+
//플로이드 와샬 알고리즘을 공부할 수 있는 문제였다.( DP 를 기반 )
3+
//플로이드 와샬 알고리즘은 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구하는 알고리즘이다.
4+
//다익스트라는 한 지점에서 다른 지점까지의 최단 거리이기 때문에 1차원 리스트에 저장한다.
5+
//다익스트라는 그리디 알고리즘
6+
import java.io.*;
7+
import java.util.*;
8+
9+
public class BOJ11403 {
10+
static int N;
11+
static int[][] arr;
12+
public static void main(String[] args) throws IOException {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
15+
StringTokenizer st;
16+
17+
N = Integer.parseInt(br.readLine());
18+
arr = new int[N+1][N+1];
19+
20+
for(int i = 1; i <= N; i++) {
21+
st = new StringTokenizer(br.readLine());
22+
for(int j = 1; j <= N; j++) {
23+
int n = Integer.parseInt(st.nextToken());
24+
arr[i][j] = n;
25+
}
26+
}
27+
28+
//플로이드 워샬 알고리즘
29+
for(int k = 1; k <= N; k++) {
30+
for(int i = 1; i <= N; i++) {
31+
for(int j = 1; j <= N; j++) {
32+
if(arr[i][k] == 1 && arr[k][j] == 1) {
33+
arr[i][j] = 1;
34+
}
35+
}
36+
}
37+
}
38+
39+
for(int i = 1; i <= N; i++) {
40+
for(int j = 1; j <= N; j++) {
41+
System.out.print(arr[i][j] + " ");
42+
}
43+
System.out.println();
44+
}
45+
46+
47+
48+
49+
bw.flush();
50+
bw.close();
51+
br.close();
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//BOJ11663 선분 위의 점, 실버3
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class BOJ11663 {
6+
static int N, M;
7+
static long[] point;
8+
public static void main(String[] args) throws IOException {
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
13+
N = Integer.parseInt(st.nextToken());
14+
M = Integer.parseInt(st.nextToken());
15+
point = new long[N];
16+
17+
st = new StringTokenizer(br.readLine());
18+
for(int i = 0; i < N; i++) {
19+
int n = Integer.parseInt(st.nextToken());
20+
point[i] = n;
21+
}
22+
Arrays.sort(point);
23+
24+
long ans = 0;
25+
for(int j = 0; j < M; j++) {
26+
st = new StringTokenizer(br.readLine());
27+
int x = Integer.parseInt(st.nextToken());
28+
int y = Integer.parseInt(st.nextToken());
29+
30+
ans = BinarySearch(x, y);
31+
bw.write(ans +"\n");
32+
}
33+
bw.flush();
34+
bw.close();
35+
br.close();
36+
}
37+
static long BinarySearch(int x, int y) {
38+
int start = 0;
39+
int end = point.length-1;
40+
41+
while(start <= end) {
42+
int mid = (start + end) / 2;
43+
44+
if(point[mid] < x) {
45+
start = mid + 1;
46+
}else {
47+
end = mid - 1;
48+
}
49+
}
50+
int startIndex = start;
51+
52+
start = 0;
53+
end = point.length-1;
54+
55+
while(start <= end) {
56+
int mid = (start + end) / 2;
57+
58+
if(y < point[mid]) {
59+
end = mid - 1;
60+
}else {
61+
start = mid + 1;
62+
}
63+
}
64+
int endIndex = end + 1;
65+
66+
// System.out.println(startIndex + " " + endIndex);
67+
return endIndex - startIndex;
68+
}
69+
}
70+
71+
72+
73+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//BOJ1300 K번째 수, 골드1
2+
//이 문제 또한 처음에 이분 탐색을 생각하지 못했다.
3+
//N 크기 조건을 생각하지 않고 냅다 배열을 사용하였지만 역시 메모리 초과가 발생하였다.
4+
//N은 10^5 로 전체 행렬의 크기는 최대 10^10 으로, 10,000,000,000 (100억)이 된다.
5+
//이 말은 행렬을 만들어 브루트 포스로 탐색하기에는 너무 많은 메모리와 시간을 잡아먹게 된다는 의미다.
6+
// 참고 자료 : https://st-lab.tistory.com/281
7+
8+
import java.io.*;
9+
import java.util.*;
10+
11+
public class BOJ1300 {
12+
public static void main(String[] args) throws IOException {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
15+
int N = Integer.parseInt(br.readLine());
16+
int K = Integer.parseInt(br.readLine());
17+
18+
long start = 1;
19+
long end = K; //여기서 틀림
20+
21+
while(start <= end) {
22+
long mid = (start+end) / 2;
23+
long count = 0;
24+
25+
// 임의의 x(mid)에 대해 i번 째 행을 나눔으로써 x보다 작거나 같은 원소의 개수
26+
// 누적 합을 구한다.
27+
// 이 때 각 행의 원소의 개수가 N(열 개수)를 초과하지 않는 선에서 합해주어야 한다.
28+
for(int i = 1; i <= N; i++) {
29+
count += Math.min(mid/i, N);
30+
}
31+
32+
if(count < K) {
33+
start = mid + 1;
34+
}else {
35+
end = mid - 1;
36+
}
37+
}
38+
39+
bw.write(start+"\n");
40+
bw.flush();
41+
bw.close();
42+
br.close();
43+
}
44+
}

0 commit comments

Comments
 (0)