1920번

2023. 1. 13. 09:54·CS 이론/알고리즘
728x90

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

이번 문제는 자료구조를 이용하는 이분탐색이다.

나는 이 문제를 반복문 대신 재귀적으로 접근해보았다.

그런데 여지껏 계속 N과M, 분할정복 등 결과값이 연속적으로 연결되는 방식의 재귀함수를 만들다가 이분탐색을 만들려고 하니 조금 미숙한 부분이 있었다.

그 부분은 return부분인데, 내가 계속 해오던 DFS나 분할정복 등은 return값들이 연관되어 있는 문제만 풀다가 풀려고 하니 return을 어떻게 처리해야할지 고민했었다.

간단한 해결책은 그냥 재귀함수의 호출을 return으로 하는 것이었다.

또한 stackoverflow가 떠서 어느것이 문제인가 생각했는데 원인은 start지점과 end지점이 교차한 후 계속 반복되어서 였다.

이 문제는 이분탐색 그 자체이기 때문에 자료구조를 공부한 사람이라면 누구나 원리는 알고 있을 것이다.

 

정답 코드는 아래와 같다.

package backjoon.b1920;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class b1920 {
    static ArrayList<Integer> arr;
    static ArrayList<Integer> samp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        arr = new ArrayList<>();

        for(int i=0; i<N; i++){
            arr.add(Integer.parseInt(st.nextToken()));
        }
        arr.sort(Integer::compareTo);
        int M = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        samp = new ArrayList<>();

        for(int i=0; i<M; i++){
            samp.add(Integer.parseInt(st.nextToken()));
        }
        StringBuilder sb = new StringBuilder();
        for(int i : samp){
            sb.append(binarySearch(i,0,arr.size()-1)).append("\n");
        }
        System.out.println(sb);
    }
    public static int binarySearch(int search, int start, int end){
        int mid = (start+end)/2;
        if(start<=end){
            if(search<arr.get(mid)){
                return binarySearch(search,start,mid-1);
            }
            else if(search>arr.get(mid)){
               return binarySearch(search,mid+1,end);
            }
            else if (search==arr.get(mid)) {
                return 1;
            }
        }
        return 0;
    }
}
728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

1436번  (1) 2023.01.16
11279번  (0) 2023.01.14
2740번  (0) 2023.01.11
2630번  (0) 2023.01.10
11047번  (1) 2023.01.07
'CS 이론/알고리즘' 카테고리의 다른 글
  • 1436번
  • 11279번
  • 2740번
  • 2630번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    8기
    누적합
    회고록
    타임리프
    Spring
    절개와지조
    오블완
    나는 감자
    DFS
    감자
    뛰슈
    BFS
    백준
    자바
    JPA
    그래프 순회
    프리코스
    티스토리챌린지
    어렵다
    모각코
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
1920번
상단으로

티스토리툴바