My Profile

김형훈

안녕하세요.
김형훈입니다.

백준 20304 비밀번호 제작

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