[백준/BOJ] 백준 20304번 : 비밀번호 제작
2021. 9. 1. 15:17ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/20304
20304번: 비밀번호 제작
서강대학교 전산실에서 보안직원으로 일하는 향빈이는 한 통의 이메일을 받게 되었다. 이메일에는 서버 관리자 계정에 대한 비정상적인 로그인 시도가 감지되었다는 내용이 적혀 있었고, 첨부
www.acmicpc.net
로그인 시도에 사용된 비밀번호 값들 에서 bfs를 통해 탐색을 하여 가장 깊은 depth를 구하는 방법으로 문제를 해결했다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <queue>
#include <bitset>
using namespace std;
int n;
int max_bit_size = 0; //비밀번호 최댓값의 비트 자리값 저장
int m;
vector<int> p;
queue<int> q;
vector<int> discovered(1000001, 0);
vector<int> depth(1000001, 0);
void Make_max_bit_size()
{
int check = n;
while (1)
{
if (check / 2 != 0)
{
max_bit_size++;
check /= 2;
}
else
{
max_bit_size++;
break;
}
}
}
int Solve()
{
for (int i = 0; i < p.size(); i++)
{
q.push(p[i]);
discovered[p[i]] = 1;
depth[p[i]] = 0;
}
while (!q.empty())
{
int here = q.front();
q.pop();
for (int i = 0; i < max_bit_size; i++)
{
int there = (here ^ (1 << i));
if (there <= n && discovered[there] == 0)
{
discovered[there] = 1;
depth[there] = depth[here] + 1;
q.push(there);
}
}
}
int ret = -1;
for (int i = 0; i <= n; i++)
ret = max(ret, depth[i]);
return ret;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n;
cin >> m;
for (int i = 0; i < m; i++)
{
int pi;
cin >> pi;
p.push_back(pi);
}
Make_max_bit_size();
cout << Solve();
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 3217번 : malloc (0) | 2021.09.01 |
---|---|
[백준/BOJ] 백준 21611번 : 마법사 상어와 블리자드 (0) | 2021.09.01 |
[백준/BOJ] 백준 2494번 : 숫자 맞추기 (0) | 2021.09.01 |
[백준/BOJ] 백준 2001번 : 보석 줍기 (0) | 2021.09.01 |
[백준/BOJ] 백준 2337번 : 트리 자르기 (0) | 2021.09.01 |