길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Binary Search

[백준 17219번] 비밀번호 찾기 (C++)

2022. 4. 5. 02:33

https://www.acmicpc.net/problem/17219

 

17219번: 비밀번호 찾기

첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다. 두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번

www.acmicpc.net


비밀번호 찾기 문제는 이분탐색을 이용하여 해결할 수 있습니다.

N이 최대 100,000이 주어지기 때문에, 일반적인 탐색으로는 시간초과가 발생할 수 있습니다.  

사이트의 주소와 비밀번호를 입력받고, 사이트의 주소를 기준으로 정렬해준다음, 이분탐색을 수행하면 비밀번호를 찾는 시간을 단축할 수 있습니다.

 

아래는 전체 코드입니다. 

#include <bits/stdc++.h>
using namespace std;

#define uri first
#define pwd second

bool cmp(pair<string, string> p1, pair<string, string> p2){return p1.uri < p2.uri;} // 사이트의 주소를 기준으로 정렬하는 함수

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m; cin >> n >> m;
    vector<pair<string, string>> dict;
    for(int i = 0; i < n; i++){
        pair<string, string> p; 
        cin >> p.uri >> p.pwd;
        dict.push_back(p);  // 사이트의 주소와 비밀번호를 입력받아 벡터에 push
    }

    sort(dict.begin(), dict.end(), cmp);    // 사이트의 주소를 기준으로 정렬

    for(int i =0 ; i < m; i++){ // 각각의 비밀번호에 대해 탐색
        string u; cin >> u;

        int left = 0, right = dict.size() - 1;
        int mid = (left + right) / 2;
        
        while(left <= right){   // 이분탐색 수행
            mid = (left + right) / 2;
            if(dict[mid].uri == u) break;
            else if(dict[mid].uri < u) 
                left = mid + 1;
            else
                right = mid - 1;
        }
        cout << dict[mid].pwd << "\n";  // 사이트의 비밀번호 출력
    }
}

'Algorithm > Binary Search' 카테고리의 다른 글

[백준 2467번] 용액 (C++)  (0) 2022.05.13
[백준 18869] 멀티버스 2 (C++)  (3) 2022.05.13
[백준 16401번] 과자 나눠주기 (C++)  (0) 2022.05.12
[백준 2295번] 세 수의 합 (C++)  (0) 2022.05.12
[백준 1620번] 나는야 포켓몬 마스터 이다솜 (C++)  (0) 2022.04.01
    'Algorithm/Binary Search' 카테고리의 다른 글
    • [백준 18869] 멀티버스 2 (C++)
    • [백준 16401번] 과자 나눠주기 (C++)
    • [백준 2295번] 세 수의 합 (C++)
    • [백준 1620번] 나는야 포켓몬 마스터 이다솜 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바