silver 4. 수 찾기 (1920)
07 Feb 2022 | 알고리즘 프로그래밍 자바silver 4. 수 찾기 (1920)
문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성
입력: 첫 줄에는 자연수 N이 주어짐. 다음 줄에는 N개의 정수가 주어짐. 다음 줄에 줄에는 자연수 M이 주어지고, 마지막 줄에는 M개의 정수가 주어짐. 이 수들이 A 안에 존재하는지 알아내면 됨
출력: M개의 줄에 답을 출력. 존재하면 1을, 존재하지 않으면 0을 출력
풀이
-
아이디어: 아이디어는 간단함. 주어지는 M개의 정수들과 N에 있는 정수를 돌아가면서 하나씩 비교하면 됨
-
구현 1. for문을 통해 값을 하나씩 비교
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int lenN = Integer.parseInt(br.readLine()); // N 값을 받아옴 ArrayList<Integer> N = new ArrayList<Integer>(input(br, lenN)); // N개의 정수를 입력받아 ArrayList에 저장 int lenM = Integer.parseInt(br.readLine()); // M 값을 받아옴 ArrayList<Integer> M = new ArrayList<Integer>(input(br, lenM)); // M개의 정수를 입력받아 ArrayList에 저장 // 결과를 저장할 ArrayList List<Integer> result = new ArrayList<Integer> (); // for문을 통해 값 비교 for (int i=0; i < lenM; i++){ if(N.contains(M.get(i))){ // 정수가 N에 있으면 1를 추가 result.add(1); } else{ // 없으면 0을 추가 result.add(0); } } // 결과값 출력 for (int i: result){ System.out.println(i); } } // length개의 정수를 입력받아 ArrayList에 저장한 후 리턴해주는 메서드 public static ArrayList<Integer> input(BufferedReader br, int length) throws IOException { StringTokenizer st = new StringTokenizer(br.readLine()); ArrayList<Integer> result = new ArrayList<Integer> (); for (int i=0; i < length; i++){ result.add(Integer.parseInt(st.nextToken())); } return result; }
- 결과: 시간 초과
- 단순히 for문을 사용해 비교하면 시간 초과 발생
- 주어진 시간이 짧으므로 탐색 방법 중 이진 탐색(binary search) 방법을 사용하기로 함
- 결과: 시간 초과
-
구현 2. Binary Search를 통한 탐색
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int lenN = Integer.parseInt(br.readLine()); int[] N = new int[lenN]; StringTokenizer st = new StringTokenizer(br.readLine()); // N개의 정수 입력받아옴 for(int i=0; i<lenN; i++){ N[i] = Integer.parseInt(st.nextToken()); } // 이분 탐색을 위해 N을 정렬 Arrays.sort(N); int lenM = Integer.parseInt(br.readLine()); st = new StringTokenizer(br.readLine()); // 결과를 저장해줄 StringBuilder StringBuilder sb = new StringBuilder(); for (int i=0; i<lenM; i++){ // nextToken()을 통해 정수를 하나씩 받아오면서 // binarySearch() 메서드를 통해 받아온 정수가 0 이상일 경우 // N개의 정수에 포함되어 있는지 탐색 if(Arrays.binarySearch(N, Integer.parseInt(st.nextToken())) >= 0){ // 포함되어있다면 sb.append(1).append('\n'); // sb에 1과 enter 값을 추가. enter 값을 추가해주는 이유는 형식에 맞춰서 출력해주기 위함 } else{ // 포함되어있지 않다면 sb.append(0).append('\n'); // sb에 0과 enter 값을 추가 } } // 결과값 출력 System.out.println(sb); } }
- Binary Search를 사용해 탐색한 결과 테스트 통과함
배운점
- Arrays 컬렉션 내 Binary Search를 실행해주는 메서드 존재
- 여러 개의 결과값을 리스트에 저장해 for-each문을 활용해 출력하는 방법 외에도 StingBuilder를 활용해 출력할 수 있음