이 영역을 누르면 첫 페이지로 이동
hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

페이지 맨 위로 올라가기

hoonDEV

BOJ 1920 - 수 찾기 문제풀이

  • 2020.04.01 23:10
  • 알고리즘/문제풀이

문제를 읽고 이해하기

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다.

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

재정의와 추상화

문제를 보고 처음 딱 떠오른 algorithm 헤더의 STL 함수가 2개가 있다. 하나는 find(), 하나는 binary_search()이다. 그러면 두 함수를 비교분석해보자.

find 함수

  • n개의 element에 대해 O(n)의 시간 복잡도를 가진다.
  • 하나 하나 찾는 것이므로, 정렬이 필요가 없다.
  • 이는 alrogithm 헤더에 있는 find() 함수에 대한 것이므로, set, map 등에서의 find() 함수는 시간 복잡도가 다르다.

binary_search 함수

  • 정렬된 n개의 element에 대해 O(logn)의 시간 복잡도를 가진다.
  • 정렬되어 있어야 하므로, O(nlogn)의 시간 복잡도를 가지는 sort() 함수를 먼저 사용해야 한다.

언뜻보면, binary_search가 sort 함수를 함께 써야하기 때문에 더 느리다고 생각할 수 있는데, 실제로 계산해보면 그렇지 않다.

M개의 정수 각각을 배열 A에 있는 N개의 정수에 대해서 탐색해야 하므로, find 함수와 binary_search 함수 + sort 함수를 썼을 때의 시간 복잡도는 아래와 같다.

  1. find 함수 : M * O(N) = O(MN)
    N과 M을 각각 최댓값인 100,000으로 두면, 약 10억(약 10초)
  2. binary_search 함수 : O(NlogN) + M * O(logN) = O((N + M)logN)
    N과 M을 각각 최댓값인 100,000으로 두면, 약 20만(약 0.002초)

코드 작성

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    cin.sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, m;
    int a[100000], b[100000];

    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];

    cin >> m;
    for (int i = 0; i < m; i++)
        cin >> b[i];

    sort(a, a + n);
    for (int target = 0; target < m; target++)
        cout << binary_search(a, a + n, b[target]) << '\n';

    return 0;
}

비고

binary_search 함수와 find 함수를 사용했을 때 각각 소요된 시간

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 1992 - 쿼드트리 문제풀이  (0) 2020.04.03
BOJ 6010 - Music Notes 문제풀이  (0) 2020.04.02
BOJ 11055 - 가장 큰 증가 부분 수열  (0) 2020.04.01
BOJ 11048 - 이동하기 문제풀이  (0) 2020.04.01
BOJ 11052 - 카드 구매하기 문제풀이  (0) 2020.04.01

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • BOJ 1992 - 쿼드트리 문제풀이

    BOJ 1992 - 쿼드트리 문제풀이

    2020.04.03
  • BOJ 6010 - Music Notes 문제풀이

    BOJ 6010 - Music Notes 문제풀이

    2020.04.02
  • BOJ 11055 - 가장 큰 증가 부분 수열

    BOJ 11055 - 가장 큰 증가 부분 수열

    2020.04.01
  • BOJ 11048 - 이동하기 문제풀이

    BOJ 11048 - 이동하기 문제풀이

    2020.04.01
다른 글 더 둘러보기

정보

hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

  • hoonDEV의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그

카테고리

  • 분류 전체보기 (91)
    • 일상 (13)
      • 후기 (1)
      • 계획 (11)
    • 공지사항 (1)
    • 알고리즘 (54)
      • 문제풀이 (53)
      • 이론 (1)
    • 공부 (19)
      • React (0)
      • Angular (5)
      • Java (3)
      • C, C++ (3)
      • JavaScript (6)
      • WEB (2)
    • 디자인 (1)
      • UI, UX (1)
    • 개발 (0)
      • boom (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 이분탐색
  • es6
  • 백준
  • 문제풀이
  • javascript
  • dp
  • 그리디
  • 알고리즘

나의 외부 링크

정보

훈개발자의 hoonDEV

hoonDEV

훈개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 훈개발자. Designed by Fraccino.

티스토리툴바