์ซ์ ์นด๋ 2 - ๋ฐฑ์ค 10816
- ๋๋ฅผ ๋ฏธ์น๊ฒ ๋ง๋ ๋ฌธ์
- ์๋ง์ ๋ฐํ์ ์๋ฌ, ์๊ฐ ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ฅผ ๊ฒช์ผ๋ฉด์ ๋ฏธ์ณ๋ฒ๋ฆฌ๋ ์ค ์์๋ค.
์ด์ง ํ์์ผ๋ก ํ์ด๋ณด๊ธฐ
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_5์ฃผ์ฐจ.๋ฐฑ์ค;
import java.io.*;
import java.util.*;
public class ์ซ์์นด๋2_10816_binary {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuffer sb = new StringBuffer();
static int n, m, count;
static int[] arr1, arr2;
static boolean[] check;
public static void main(String[] args) throws Exception {
n = Integer.parseInt(br.readLine());
arr1 = new int[n];
check = new boolean[n];
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = 0;
while (st.hasMoreTokens()) {
arr1[cnt] = Integer.parseInt(st.nextToken());
cnt++;
}
Arrays.sort(arr1);
m = Integer.parseInt(br.readLine());
arr2 = new int[m];
st = new StringTokenizer(br.readLine());
cnt = 0;
while (st.hasMoreTokens()) {
arr2[cnt] = Integer.parseInt(st.nextToken());
count = 0;
card(arr1, 0, n - 1, arr2[cnt]);
sb.append(count + " ");
cnt++;
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
public static void card(int[] arr, int start, int end, int target) {
if (start > end || start < 0 || end >= n)
return;
int mid = (start + end) / 2;
int mid1 = mid + 1 >= n ? n - 1 : mid + 1;
int mid2 = mid - 1 < 0 ? 0 : mid - 1;
if (arr[mid] == target) {
if (!check[mid]) {
count++;
check[mid] = true;
if (arr[mid2] != target || arr[mid1] == target) {
card(arr, mid1, end, target);
} else if (arr[mid2] == target || arr[mid1] != target) {
card(arr, start, mid2, target);
}
}
} else if (arr[mid] > target) {
card(arr, start, mid2, target);
} else {
card(arr, mid1, end, target);
}
}
}
์์ ๋ถํ ์ฐพ๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ์ ๋ต๋ฅ ์ด 30% ๋์ด๊ธด ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ๋ ์ด๋์ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ ์ด์ง ํ์์ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํ์๊ณ , ๋ด๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
arr1๋ฐฐ์ด์ ์ด์ง ํ์์ผ๋กtarget๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ ๊ฒฝ์ฐ- boolean ๋ฐฐ์ด์ธ
check์ ํด๋น ์ธ๋ฑ์ค ๊ฐ์true๋ก ๋ณ๊ฒฝํด ์ฌ๋ฐฉ๋ฌธ์ ์ผ์ด๋ ์ ์๋ ์ค๋ณต ์นด์ดํธ์ ์ํ์ฑ์ ์ ๊ฑฐํ๋ค. cnt++๋ฅผ ์คํํ๋ค.- ํด๋น ์ธ๋ฑ์ค์ ์ , ํ ์ธ๋ฑ์ค ๋ฐ์ดํฐ์
target์ด ๊ฐ์ ๊ฒฝ์ฐ- ์ ์ ์ธ๋ฑ์ค์ ๊ฐ์ ๊ฒฝ์ฐ →
end = mid - 1 - ํ์ ์ธ๋ฑ์ค์ ๊ฐ์ ๊ฒฝ์ฐ →
start = mid + 1
- ์ ์ ์ธ๋ฑ์ค์ ๊ฐ์ ๊ฒฝ์ฐ →
- boolean ๋ฐฐ์ด์ธ
target์ดarr1[mid]๋ณด๋ค ์์ ๊ฒฝ์ฐend = mid - 1
target์ดarr1[mid]๋ณด๋ค ํด ๊ฒฝ์ฐstart = mid + 1
์ด๋ฌํ ๋ก์ง์ผ๋ก ๊ตฌํํ๊ณ , ์ฃผ์ด์ง ํ
์คํธ ์ผ์ด์ค๋ก๋ ์ด์์์ด ์ถ๋ ฅ๋์๋ค.
ํ์ง๋ง ๋ฐฑ์ค์์ ์ฑ์ ํ์ ๋ ์๊ฐ ์ด๊ณผ ํน์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ๋น์์๋ ๋ฐ์ํ๋ ์ด์ ๋ฅผ ์ ์ ์์๊ณ , ๊ทธ๋ฅ ๋ด ์ฝ๋๊ฐ ์๋ชป๋์๋ค๊ณ ๋ง ์๊ฐํ๋ค.
๊ทธ๋์ ์์๋ณธ ๊ฒฐ๊ณผ, Lower / Upper Bound ์๊ณ ๋ฆฌ์ฆ์ ์์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊ฑฐ๋ ๋ต๋ณ์ ๋ณด๊ณ ์ด๋ฅผ ์ ์ฉํด๋ดค๋ค.
Lower / Upper Bound๋ฅผ ์ด์ฉํด ํ์ด๋ณด๊ธฐ
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuffer sb = new StringBuffer();
static int n, m;
static int[] arr1 = new int[20000001];
public static void main(String[] args) throws Exception {
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = 0;
while (st.hasMoreTokens()) {
arr1[cnt] = Integer.parseInt(st.nextToken());
cnt++;
}
Arrays.sort(arr1);
m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
cnt = 0;
while (st.hasMoreTokens()) {
int result = check(Integer.parseInt(st.nextToken()));
sb.append(result + " ");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
public static int check(int target) {
int lower = lowerbound(arr1, target);
int upper = upperbound(arr1, target, lower);
return upper - lower;
}
public static int lowerbound(int[] arr, int target) {
int lower = 0;
int upper = arr1.length;
while (lower < upper) {
int mid = lower + (upper - lower) / 2;
if (target <= arr1[mid]) {
upper = mid;
} else {
lower = mid + 1;
}
}
return lower;
}
public static int upperbound(int[] arr, int target, int lowerIdx) {
int lower = lowerIdx;
int upper = arr1.length;
while (lower < upper) {
int mid = lower + (upper - lower) / 2;
if (target >= arr[mid]) {
lower = mid + 1;
} else {
upper = mid;
}
}
return lower;
}
}
(์ด๋ป๊ฒ ๋ก์ง์ด ์งํ๋๋์ง ํ์ธํด๋ณด๋ ค๊ณ System.out.println() ์ด ๋ง๋ค..^^; ๋๋ฒํน๋ ํ ์ค ์์์ผ ํ๋๋ฐ..)
์ฒ์์๋ check ๋ผ๋ ๋ฉ์๋์์ด main ๋ฉ์๋์์ arr2 ๋ฐฐ์ด์ ์
๋ ฅ๋ฐ์ผ๋ฉด์ lower, upper ํจ์๋ฅผ ์คํํ๊ณ ๋ฐํ๋๋ int ๊ฐ์ ๊ณ์ฐํ ๊ฒ์ ์ถ๋ ฅํ๋ค. ๊ทผ๋ฐ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด ๋๋ ๋๋์ฒด ์ ๋ฐํ์ ์๋ฌ๊ฐ ๋๋์ง ์ ์ ์์๋ค.
๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์กฐ๊ธ(?) ์ฐธ๊ณ ํด์ ์์๋ธ ๊ฒฐ๊ณผ, ๋ด ์ฝ๋์์ ์ถ๋ ฅ์ ์ํ lower, upper ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด check ๋ฉ์๋๋ฅผ ๋ง๋ค์๊ณ , ํน์๋ ํ๋ ๋ง์์ upper ๋ฉ์๋์๋ lower ๋ฉ์๋์์ ๋ฐํํ ๊ฐ์ ๋ฃ์ด์ค ์ต๋ํ ์ ์ ํ์๋ก ํ์ํ ์ ์๋๋ก ๊ตฌํํด๋ณด์๋ค.
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuffer sb = new StringBuffer();
static int n, m;
static int[] arr1 = new int[20000001];
public static void main(String[] args) throws Exception {
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = 0;
while (st.hasMoreTokens()) {
arr1[cnt] = Integer.parseInt(st.nextToken());
cnt++;
}
Arrays.sort(arr1);
m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
cnt = 0;
while (st.hasMoreTokens()) {
int result = check(Integer.parseInt(st.nextToken()));
sb.append(result + " ");
}
bw.write(sb.toString());
bw.flush();
}
public static int check(int target) {
int lower = lowerbound(arr1, target);
int upper = upperbound(arr1, target, lower);
return upper - lower;
}
public static int lowerbound(int[] arr, int target) {
int lower = 0;
int upper = arr1.length;
while (lower < upper) {
int mid = (upper + lower) / 2;
if (target <= arr1[mid]) {
upper = mid;
} else {
lower = mid + 1;
}
}
return lower;
}
public static int upperbound(int[] arr, int target, int lowerIdx) {
int lower = lowerIdx;
int upper = arr1.length;
while (lower < upper) {
int mid = (upper + lower) / 2;
if (target >= arr[mid]) {
lower = mid + 1;
} else {
upper = mid;
}
}
return lower;
}
}
์ด๋ ๊ฒ check ๋ฉ์๋๋ฅผ ๋ง๋๋๊น 24% ์ ๋ ๋ค์ด๊ฐ์ ๋ ํ๋ ธ์ต๋๋ค๋ฅผ ๋ฐ์ ์ ์์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ด์ ๋ด๊ฐ ์ง ์ฝ๋๋ ํ๋ฆฐ ์ฝ๋๋ผ๋ ๋ง์ด๋ค.๐ค
๊ทธ๋์ ์ด๋๊ฐ ํ๋ ธ์๊น ํ์ธํ๋ ์ค์ ๋๋ฌด์ง ์ ์ ์์ด์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์กฐ๊ธ ์ฐธ๊ณ ํ๋๋ฐ, lower / upper ๋ฉ์๋๊ฐ ๊ฑฐ์ ์ด์ง ํ์๊ณผ ๋น์ทํ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ค.
[BOJ] 10816. ์ซ์ ์นด๋ 2 - (Java)
[BOJ] 10816. ์ซ์ ์นด๋ 2 - (Java) Problem ์ ์ถ์ผ : 2020-04-02 ๋ฌธ์ ํ์ด ์๊ฐ : 30M ๋์ด๋ : โ โ โ link : https://www.acmicpc.net/problem/10816 ์ซ์ ์นด๋๋ ์ ์ ํ๋๊ฐ ์ ํ์ ธ ์๋ ์นด๋์ด๋ค. ์๊ทผ์ด๋..
herong.tistory.com
์ด ๋ถ์ ๊ฒฝ์ฐ
mid๊ฐ์ ๋นํธ ์ฐ์ฐ(>>)์ ํตํด ์ถ์ถํ๋ค.target๊ฐ์ดarr[mid]์ ๊ฐ์ ๋๋lower๊ฐ์mid + 1๋ก ์ค์ ํ๋ค.target๊ฐ์ดarr[mid]๋ณด๋ค ์์ ๊ฒฝ์ฐupper๊ฐ์mid๋ก ์ค์ ํ๋ค.target๊ฐ์ดarr[mid]๋ณด๋ค ํด ๊ฒฝ์ฐlower๊ฐ์mid + 1๋ก ์ค์ ํ๋ค.
๋์ ๊ต์ฅํ ๋น์ทํ๋ค. ๋ค๋ง ๋ฐํํ๋ ๊ฐ์ด ๋ค๋ฅธ๋ฐ, ์์ ๋งํฌ์์๋ lower ๋ฉ์๋์ ๊ฒฝ์ฐ +1 ์ฐ์ฐ์ ์ถ๊ฐ์ ์ผ๋ก ์งํํ๋ฉฐ check ๋ฉ์๋์์๋ +1 ์ฐ์ฐ์ ์งํํ๋ค.
๋๋ ์์ง ์๋๋ฅผ ํ์
ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ ๊ตฌํ ํ๋ ๋ฐฉ์๋๋ก +1 ์ฐ์ฐ์ ์ ์ธํ๊ณ ํ๋๋ ๋ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์คฌ๋ค.(์๊ธฐ๋ ์งฌ๋ฝ)

์๋ง๋ 1๋ฒ์ ๊ฒฝ์ฐ ๋๋ฌธ์ +1 ์ฐ์ฐ์ ์ถ๊ฐ์ ์ผ๋ก ํด์ค ๊ฒ ๊ฐ๋ค. ์ด์จ๋ ์ ๋ธ๋ก๊ทธ์ ์ฝ๋๋ ์ด์ง ํ์์ ์์ฉ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ค๋ง ๋๋ ์ฌ๊ท ํจ์๋ฅผ ํตํด ๊ตฌํ ํ๊ณ , ๋ธ๋ก๊ฑฐ ๋ถ๊ป์๋ while๋ฌธ์ผ๋ก ๊ตฌํ ํ๋ค์ ์ฐจ์ด์ธ ๊ฒ ๊ฐ์๋ฐ, ์ฌ๊ท๋ก ์ธํ stackoverflow๊ฐ ๋ฐ์ํด์ ์ด์ ์ ์๊ฐ ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ, ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด ์๋๊น ์ถ๋ค.
์ต์ข ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuffer sb = new StringBuffer();
static int n, m;
static int[] arr1;
public static void main(String[] args) throws IOException {
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = 0;
arr1 = new int[n];
while (st.hasMoreTokens()) {
arr1[cnt] = Integer.parseInt(st.nextToken());
cnt++;
}
Arrays.sort(arr1);
m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
cnt = 0;
while (st.hasMoreTokens()) {
int target = Integer.parseInt(st.nextToken());
int result = check(target);
sb.append(result + " ");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
public static int check(int target) {
int lower = lowerbound(target);
int upper = upperbound(target);
return upper - lower;
}
public static int lowerbound(int target) {
int lower = 0;
int upper = n;
while (lower < upper) {
int mid = (upper + lower) / 2;
if (target == arr1[mid]) {
upper = mid;
} else if (arr1[mid] > target) {
upper = mid;
} else {
lower = mid + 1;
}
}
return lower;
}
public static int upperbound(int target) {
int lower = 0;
int upper = n;
while (lower < upper) {
int mid = (upper + lower) / 2;
if (target == arr1[mid]) {
lower = mid + 1;
} else if (target < arr1[mid]) {
upper = mid;
} else {
lower = mid + 1;
}
}
return upper;
}
}
์ฆ, ์ง๊ธ๊น์ง ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ์ ๋ฆฌํด๋ณด์๋ฉด
- ์๊ฐ ์ด๊ณผ
- ๋ง ๊ทธ๋๋ก ์๊ฐ ์ด๊ณผ๋ฅผ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค. ์ฒ์ ์ ์ถํ ์ฝ๋๋ ์ฌ๊ท ํจ์๋ก ๊ตฌํ ํ๋๋ฐ, ์ด ๋
target๊ณผarr[mid]๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐarr[mid]์ ์, ๋ค ์ธ๋ฑ์ค๋ ๋ค์ ํ์ํ๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋ค. - ์ด๋ฌํ ์ด์ ๋ก ๋ถํ์ํ ์ฌ๊ท ํจ์๊ฐ ํธ์ถ ๋๋ฉด์ ์ ํด์ง ์๊ฐ๋ณด๋ค ์ด๊ณผํด์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค.
- ๋ง ๊ทธ๋๋ก ์๊ฐ ์ด๊ณผ๋ฅผ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค. ์ฒ์ ์ ์ถํ ์ฝ๋๋ ์ฌ๊ท ํจ์๋ก ๊ตฌํ ํ๋๋ฐ, ์ด ๋
- ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ
- ์์ ๋ฌธ์ ์ ๋น์ทํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
- ์ด ๊ฒฝ์ฐ๋ ์ฌ๊ท ํจ์๋ก ๊ตฌํ ํ๋๋ฐ
arr[mid]์ ์, ๋ค ์ธ๋ฑ์ค๋ฅผ ๋ค์ ํ์ํ ๋ ์๋ก์ด ์กฐ๊ฑด์ ์ถ๊ฐํ๊ฒ ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๋ง์ด ์์๋๋ ๋ฌธ์ ๋ฅผ ๋ฐ์ํ๋ ๊ฒ ๊ฐ๋ค.
- ๋ฐํ์ ์๋ฌ
- ์์ง๋ ์ ํํ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค.
- ์์์ผ๋ก๋ ์ธ๋ฑ์ค ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๊ฑฐ๋ ์ ์ ๊ฐ์ ํ์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค.
- ํ๋ ธ์ต๋๋ค.
lower/upper๋ฉ์๋์์target๊ณผarr[mid]๋ฅผ ๋น๊ตํ๋ ์กฐ๊ฑด๋ฌธ์≤ํน์else๋ฅผ ์ด์ฉํด ๋ ๊ฐ์ง๋ก๋ง ๊ตฌํ ํ๋๋ฐ ์ด ๊ฒฝ์ฐ์ ์ ํํ ๋ฐฉํฅ์ ์ก์ง ๋ชปํด ์ณ์ง ๋ชปํ ๋ต์ ์ค๊ฐ(24%)์ ์ถ๋ ฅํ ๊ฒ ๊ฐ๋ค.
๋๋ฌด ๋ต๋ตํ์ง๋ง ๊ทธ๋๋ ์ดํดํ๊ณ ๋๋ ์ฆ๊ฑฐ์ ๋ค. ๋ ๋ณด์! (๊ณ์ ์ ๋ ฌ์ ํตํด ํ๋ฒ ํ์ด ๋ด์ผ๊ฒ ๋ค.)
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐฑ์ค 1322 | ๋นํธ ์ฐ์ฐ, X์ K (0) | 2020.11.25 |
|---|---|
| ๋ฐฑ์ค 1158 | Queue, ์์ธํธ์ค ๋ฌธ์ (0) | 2020.11.25 |
| ํ์ | ์์ฐจ ํ์, ์ด์ง ํ์, ๋ถํ ์ฐพ๊ธฐ (0) | 2020.11.07 |
| ๋ฐฑ์ค 2667 | DFS, ๋จ์ง ๋ฒํธ ๋ถ์ด๊ธฐ (0) | 2020.11.02 |
| ๋ฐฑ์ค 2138 | ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ ๊ตฌ์ ์ค์์น (0) | 2020.11.01 |