์ซ์ ์นด๋ 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 ๋ฉ์๋๊ฐ ๊ฑฐ์ ์ด์ง ํ์๊ณผ ๋น์ทํ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ค.
์ด ๋ถ์ ๊ฒฝ์ฐ
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 |