오늘도 어김없이 이분 탐색에 대한 문제를 풀어봤다.
어제 풀었던 숫자카드2와 비슷한 문제인데, 동일한 숫자가 있을때는 1을 없을때는 0을 출력하도록 하는 문제였다.
public static void main(String[] args) { int N; int M; StringBuilder sb = new StringBuilder(); Scanner sc = new Scanner(System.in); N = sc.nextInt(); int[] nArr = new int[N]; for (int i = 0; i < N; i++) { nArr[i] = sc.nextInt(); } Arrays.sort(nArr); M = sc.nextInt(); for (int i = 0; i < M; i++) { int m = sc.nextInt(); int left = 0; int right = N - 1; while (left <= right) { int mid = (left + right) / 2; if (nArr[mid] == m) { sb.append(1 + " "); break; } if (nArr[mid] > m) { right = mid - 1; } else { left = mid + 1; } if (left > right) { sb.append(0 + " "); break; } } } System.out.println(sb.toString()); }
어제 풀어 본 문제를 해결하지는 못했지만 같은 유형의 문제이기도 하고
이분탐색으로 풀 수 있을 것 같은 마음에 금방 풀겠지,, 했지만,,,
생각보다 너무 오랫동안 풀게 되었다.
일단 위의 코드는 다른 분이 올려두신 코드를 참고하여 제출한 코드이다.
내가 푼 코드는 왜인지 모르겠는데 1을 체크하지 않고 다 0으로만 출력이 되어서 다른 분들 코드를 검색하다가 내 코드와 제일 비슷한 코드를 참고하였다.
public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(bf.readLine()); int[] n = new int[N]; StringTokenizer st = new StringTokenizer(bf.readLine(), " "); for (int i = 0; i < N; i++) { n[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(n); int M = Integer.parseInt(bf.readLine()); int[] m = new int[M]; st = new StringTokenizer(bf.readLine(), " "); for (int i = 0; i < M; i++) { m[i] = Integer.parseInt(st.nextToken()); } StringBuilder sb = new StringBuilder(); for(int i=0; i<M; i++){ int start = 0; int end = N-1; while(start <= end){ int mid = (start+end)/2; if(m[i] == n[mid]){ sb.append(1 + " "); break; } if(m[i] >= n[mid]){ end = mid-1; }else{ start = mid+1; } if (start > end) { sb.append(0 + " "); break; } } } System.out.println(sb); }
이 코드가 미해결 코드이다.
어제 풀지못한 문제와 함께 이 문제도 다시 봐야할 것 같다,,😞