승코딩당당당

[C++] 백준 17219: 비밀번호 찾기 본문

PS/BOJ

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

승코딩당당당 2026. 2. 10. 15:24

문제

[C++] 백준 17219: 비밀번호 찾기 SILVER 4
https://www.acmicpc.net/problem/17219

 


 

접근 방법

이 문제는 사이트 주소가 주어졌을 때 해당 비밀번호를 빠르게 찾아 출력하는 문제다.
핵심은 “탐색 속도”다.

 

처음에는 vector에 (사이트, 비밀번호) 쌍을 저장해 두고, 질문이 들어올 때마다 처음부터 끝까지 순회하며 찾는 방식으로 구현했다.
하지만 이 방식은 매 질의마다 선형 탐색(O(N))이 필요해서, 입력 크기가 커지면 결국 시간 초과가 발생한다.

 

그래서 접근 방식을 바꿔, 키를 기준으로 바로 값을 찾을 수 있는 자료구조를 사용해야겠다고 판단했다.
여기서 사용한 것이 바로 map이다.

 

map을 사용한 풀이 아이디어

map은

  • key → value 형태로 데이터를 저장하고
  • key를 기준으로 빠르게 탐색할 수 있는 자료구조다.

이 문제에서는 아래로 딱 맞아떨어진다.

  • key : 사이트 주소
  • value : 비밀번호

 

1. 사이트 정보 저장

사이트 주소를 key로, 비밀번호를 value로 저장해 두면 중복 없이 깔끔하게 관리할 수 있다.

map<string, string> file;

for (int i = 0; i < n; i++)
{
    string str1, str2;
    cin >> str1 >> str2;
    file[str1] = str2;
}

 

2. 비밀번호 조회

file[str]처럼 접근하면 해당 사이트의 비밀번호를 바로 얻을 수 있다.
따로 반복문으로 찾을 필요가 없다.

for (int i = 0; i < m; i++)
{
    string str;
    cin >> str;
    cout << file[str] << '\n';
}

 

구현 시 주의할 점

  • vector + 브루트포스 탐색은 입력이 커지면 금방 한계에 부딪힌다.
    “탐색이 많이 일어나는 문제”인지 먼저 판단하는 게 중요하다.
  • map은 내부적으로 정렬된 트리 구조를 사용해 삽입과 탐색이 모두 O(log N)으로 동작한다.
  • 문자열을 key로 사용하는 문제에서는 map이나 unordered_map이 굉장히 강력한 도구가 된다.
  • 이번 문제는 map을 처음 써보기에 딱 좋은 예제였다!

 


 

코드

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n = 0, m = 0;
	cin >> n >> m;

	map<string, string> file;
	for (int i = 0; i < n; i++)
	{
		string str1, str2;
		cin >> str1 >> str2;

		file[str1] = str2;
	}
	for (int i = 0; i < m; i++)
	{
		string str;
		cin >> str;

		cout << file[str] << '\n';
	}

	return 0;
}

 

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 11279: 최대 힙  (0) 2026.02.11
[C++] 백준 9375: 패션왕 신해빈  (1) 2026.02.10
[C++] 백준 1456: 거의 소수  (0) 2026.02.10
[C++] 백준 1929: 소수 구하기  (0) 2026.02.03
[C++] 백준 13022: 늑대와 올바른 단어  (0) 2026.02.03