My Profile

김형훈

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

백준 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