-
[Java] 백준 10815 숫자 카드Programming/Algorithm 2021. 3. 3. 21:06
문제
상근이가 가진 숫자카드 N개가 주어지고, 각각의 카드에는 -10,000,000 이상 10,000,000 이하의 정수가 적혀있다.
그 다음 M개의 정수가 주어질 때 상근이가 가지고 있는 숫자인지를 판별해서 출력하는 문제이다.
2가지 방식으로 풀이했다.
1) 배열로 방문체크
- 카드가 가질 수 있는 숫자의 범위만큼 boolean배열을 만든다.
- 상근이가 가지고 있는 숫자라면 해당 인덱스의 값을 true로 초기화한다.
- M개의 카드 인덱스를 받아와서 boolean배열의 값이 true인지 확인한다.
2) 이진탐색
- 상근이가 가진 카드 배열을 오름차순 정렬한다.
- M개의 카드 값을 받아와서 상근이의 카드배열을 이진탐색한다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { // 1) 방문배열로 체크 static void solution1() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); boolean[] isPresent_m = new boolean[10_000_001]; boolean[] isPresent_p = new boolean[10_000_001]; for (int i = 0; i < N; i++) { int idx = Integer.parseInt(st.nextToken()); if (idx >= 0) isPresent_p[idx] = true; else isPresent_m[-idx] = true; } int M = Integer.parseInt(br.readLine()); st = new StringTokenizer(br.readLine()); for (int i = 0; i < M; i++) { int idx = Integer.parseInt(st.nextToken()); if (idx >= 0) { if (isPresent_p[idx]) sb.append(1).append(" "); else sb.append(0).append(" "); } else { if (isPresent_m[-idx]) sb.append(1).append(" "); else sb.append(0).append(" "); } } System.out.println(sb); } // 2) 카드배열을 이진탐색 static int[] cards; static void solution2() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); cards = new int[N]; for (int i = 0; i < N; i++) { cards[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(cards); int M = Integer.parseInt(br.readLine()); st = new StringTokenizer(br.readLine()); for (int i = 0; i < M; i++) { int target = Integer.parseInt(st.nextToken()); sb.append(binarySearch(0, N - 1, target)).append(" "); } System.out.println(sb); } static int binarySearch(int low_idx, int high_idx, int target_value) { if (high_idx < low_idx) // 등호 x return 0; int mid_idx = (low_idx + high_idx) / 2; if (cards[mid_idx] > target_value) { return binarySearch(low_idx, mid_idx - 1, target_value); } else if (cards[mid_idx] < target_value) { return binarySearch(mid_idx + 1, high_idx, target_value); } else return 1; } public static void main(String[] args) throws IOException { // solution1(); solution2(); } }
채점결과
위: 방문배열 풀이
아래: 이진탐색 풀이
'Programming > Algorithm' 카테고리의 다른 글
[Java] 프로그래머스 징검다리 (0) 2021.03.05 [Java] 프로그래머스 입국심사 (0) 2021.03.05 [Java] 백준 2110 공유기 설치 (0) 2021.03.03 [Java] 백준 2805 나무 자르기 (0) 2021.03.03 [Java] 백준 1654 랜선 자르기 (0) 2021.03.03 댓글