백준 20304 비밀번호 제작
백준 20304 비밀번호 제작
2022년 12월 17일
2022년 12월 17일
cpp, 완전 탐색
문제
문제
풀이
풀이
특정한 비밀번호 a의 안전도는 기존의 비밀번호와의 안전도 중 가장 낮은 값이다.
즉, 특정 비밀번호 a의 안전도는 기존의 비밀번호를 기준으로 안전도가 1씩 증가하는 순으로 너비 우선 탐색을 진행하였을 때 제일 먼저 도달한 값이 된다.
n 이하의 모든 수에 대해 가능한 안전도를 탐색한 뒤 가장 큰 값을 구한다.
코드
코드
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dist[1200002];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
queue<int> q;
cin >> n >> m;
for(int i=0; i<m; ++i){
int val; cin >> val;
q.push(val);
dist[val] = 1;
}
// 가능한 영역을 구함( ~3(11), ~7(111), ~15(1111),...)
int l=0;
while(n >= (1<<l)) l++;
// 가능한 영역의 안전거리를 구함
while(!q.empty()){
int x = q.front(); q.pop();
// 안전거리를 1씩 늘려가며 탐색
for(int i=0;i<l;++i){
int nx = x ^ (1<<i);
if(dist[nx]) continue;
dist[nx] = dist[x] + 1;
q.push(nx);
}
}
// n 이하의 값의 안전 거리 중 가장 큰 값 구함
int ans = 0;
for(int i=0; i<=n; ++i)
if(dist[i] > ans) ans = dist[i];
cout << ans-1;
}
결과
결과
Copyright © 2024 Hyunghoon Kim