happy coding
[java] 1920. 수 찾기 본문
https://st-lab.tistory.com/261
위는 참고한 블로그, 이 블로그는 공부기록용이기에 적어둔다.
binarySearch 를 이용하는 문제였는데
처음으로 알고리즘 문제를 본 것 같다..
처음 이분탐색인지 생각을 못하고 마구잡이로 하다가 앗 이게 아닌데 하고 검색해서 천사님의 블로그를 보고 해결했다.
import java.io.*;
import java.util.*;
public class Main {
public static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 배열은 반드시 정렬되어있어야한다.
Arrays.sort(arr);
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine(), " ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
// 찾고자 하는 값이 있을 경우 1, 없을 경우 0을 출력해야한다.
if(binarySearch(Integer.parseInt(st.nextToken())) >= 0) {
sb.append(1).append('\n');
}
else {
sb.append(0).append('\n');
}
}
System.out.println(sb);
}
/**
* @param key 찾으려는 값
* @return key와 일치하는 배열의 인덱스
*/
public static int binarySearch(int key) {
int lo = 0; // 탐색 범위의 왼쪽 끝 인덱스
int hi = arr.length - 1; // 탐색 범위의 오른쪽 끝 인덱스
// lo가 hi보다 커지기 전까지 반복한다.
while(lo <= hi) {
int mid = (lo + hi) / 2; // 중간위치를 구한다.
// key값이 중간 위치의 값보다 작을 경우
if(key < arr[mid]) {
hi = mid - 1;
}
// key값이 중간 위치의 값보다 클 경우
else if(key > arr[mid]) {
lo = mid + 1;
}
// key값과 중간 위치의 값이 같을 경우
else {
return mid;
}
}
// 찾고자 하는 값이 존재하지 않을 경우
return -1;
}
}
그리고 메소드를 이용해서 해결하는 건 아래의 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 배열은 반드시 정렬되어있어야한다.
Arrays.sort(arr);
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine(), " ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
// 찾고자 하는 값이 있을 경우 1, 없을 경우 0을 출력해야한다.
if(Arrays.binarySearch(arr, Integer.parseInt(st.nextToken())) >= 0) {
sb.append(1).append('\n');
}
else {
sb.append(0).append('\n');
}
}
System.out.println(sb);
}
}
블로그 님 말처럼 메소드를 사용하면 좀 더 코드가 간결해지지만 학습적인 측면에서는 도움은 많이 되진 않을 것 같아서 일단 둘 다 공부해놓으려고 한다.
'coding study > baekjoon' 카테고리의 다른 글
[java] 10828. 스택 (0) | 2023.08.15 |
---|---|
[java] 10773. 제로 (0) | 2023.08.15 |
[java] 1181. 단어정렬 (0) | 2023.08.13 |
[java] 10814. 나이순 정렬 (0) | 2023.08.13 |
[java] 3052. 나머지 (0) | 2023.08.13 |
Comments