-
[java] 백준 1920 : 수 찾기알고리즘 2023. 5. 16. 10:26
문제
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
시간초과
반복문으로 돌리니 시간초과가 발생했다. 그래서 찾아보니 이분탐색으로 해서 시간을 줄일 수 있었다.
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); int[] ol = new int[n]; for(int i=0; i<n; i++) { ol[i] = Integer.parseInt(st.nextToken()); } st = new StringTokenizer(br.readLine()); int m = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); int[] nl = new int[m]; for(int i=0; i<m; i++) { nl[i] = Integer.parseInt(st.nextToken()); boolean flag= false; for(int j=0; j<n; j++) { if(nl[i]==ol[j]) flag=true; } if(flag) System.out.println(1); else System.out.println(0); } } }
이분탐색 이용
배열을 하나 더 만드는 게 아니라 입력을 받으면 바로 찾는 방법으로 시간을 줄일 수 있다.
package main; import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int[] ol = new int[n]; for(int i=0; i<n; i++) { ol[i] = sc.nextInt(); } Arrays.sort(ol); int m = sc.nextInt(); for(int i=0; i<m; i++) { boolean flag= false; int target = sc.nextInt(); int start =0; int end = n-1; while (start <= end) { int mid = (start+end)/2; if(target==ol[mid]) { flag=true; break; } else if(target<ol[mid]) { end=mid-1; } else if(target>ol[mid]) { start=mid+1; } } if(flag==false) System.out.println(0); else System.out.println(1); } } }
'알고리즘' 카테고리의 다른 글
[java] 백준 2468 : 안전영역 (0) 2023.05.17 [java] 백준 5014 : 스타트링크 (0) 2023.05.16 [java] 백준 1463 : 1로 만들기 (0) 2023.05.04 [java] 백준 1244 스위치 켜고 끄기 (0) 2023.05.03 [java] 백준 2644 : 촌수계산 (0) 2023.05.02