

마참내!!
진도를 다 따라잡았습니다. 원래 블로그 운영 이전에 문제부터 풀기 시작했고, 업로드 해볼까 싶었을때는 푼 문제가 많은 상태여서, 평일에는 여유가 없다보니 주말에 틈틈이 올렸습니다. 그러다가 추석 연휴때 왕창 업로드했고, 드디어 다 올렸네요. 단계별로 풀고있긴합니다만, 너무 어려운 경우는 넘길수도 있어서, 앞으로는 푸는대로 업로드하겠습니다.
이진탐색, 이분탐색 (Binary Search)에 관련된 문제입니다. 이전 단계였던 브루트 포스방법으로 풀면, 시간초과가 되버리지요. 관련 내용에 대해 더 알고싶다면, 링크를 참조하세요.
https://namu.wiki/w/%EC%9D%B4%EC%A7%84%20%ED%83%90%EC%83%89
이진 탐색 - 나무위키
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권
namu.wiki
저는 해당 개념에 대한 부분을 얼핏 알고는 있었습니다. 수업 초 숫자맞추기 게임을 진행할때, 중점을 입력하면서 좁혀갔거든요. 정작 문제풀이에는 적용하지 못하다가, 시간 초과 후 찾아보고 이게 같은 개념이었구나 하고 깨달았습니다. 그리고 깨달았음에도 어떻게 짤것이냐, 에는 또 제대로 생각하지 못해서, 답을 참조했습니다. 생각해보니, 점점 참조하는게 많아지는군요. 하지만, 부끄러워할 시간에 조금이라도 더 보고 제 논리로 체득하는 과정을 거치면서, 유사한 문제를 풀어보며 체화하려고 합니다.
첫번쨰 시도. 브루트-포스로 풀었고, 당연히도 시간초과.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String str1 = br.readLine();
int m = Integer.parseInt(br.readLine());
String str2 = br.readLine();
String[] str3 = str1.split(" ");
String[] str4 = str2.split(" ");
int[] ans = new int[m];
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
if (str4[i].equals(str3[j])) {
ans[i] = 1;
break;
}
}
}
StringBuilder sb = new StringBuilder();
for (int i=0; i<m; i++) {
sb.append(ans[i] + " ");
}
System.out.println(sb);
}
}
다른 사람의 정답을 보고 풀어본 풀이.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int[] ncard;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
ncard = new int[n];
for (int i=0; i<n; i++) {
ncard[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(ncard);
m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i=0; i<m; i++) {
int mcard = Integer.parseInt(st.nextToken());
sb.append(binarySearch(mcard) + " ");
}
System.out.println(sb);
}
static int binarySearch(int mcard) {
int lIndex = 0;
int rIndex = ncard.length-1;
while (lIndex <= rIndex) {
int avg = (lIndex + rIndex) / 2;
int mid = ncard[avg];
if (mcard < mid) {
rIndex = avg-1;
} else if (mcard > mid) {
lIndex = avg+1;
} else return 1;
}
return 0;
}
}
'백준 문제풀이' 카테고리의 다른 글
| 1620. 나는야 포켓몬 마스터 이다솜 (0) | 2022.10.03 |
|---|---|
| 14425. 문자열 집합 (자바, Java) (0) | 2022.10.03 |
| 1436. 영화감독 숌 (자바, Java) (0) | 2022.10.02 |
| 1018. 체스판 다시 칠하기 (자바, Java) (0) | 2022.10.02 |
| 7568. 덩치 (자바, Java) (0) | 2022.10.02 |