백준 문제풀이

10815. 숫자 카드 (자바, Java)

뮤츠 2022. 10. 3. 01:52

마참내!!

진도를 다 따라잡았습니다. 원래 블로그 운영 이전에 문제부터 풀기 시작했고, 업로드 해볼까 싶었을때는 푼 문제가 많은 상태여서, 평일에는 여유가 없다보니 주말에 틈틈이 올렸습니다. 그러다가 추석 연휴때 왕창 업로드했고, 드디어 다 올렸네요. 단계별로 풀고있긴합니다만, 너무 어려운 경우는 넘길수도 있어서, 앞으로는 푸는대로 업로드하겠습니다.

 

이진탐색, 이분탐색 (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;
	}

}