백준 12025 장난꾸러기 영훈
BOJ 12025
목표 : 영훈이는 장난꾸러기라서 희현이의 비밀번호 중 1은 6으로, 6은 1로 바꾸거나 2는 7으로 7은 2로 바꿔버렸다. 이를 해결하기 위해 희현이는 비밀번호 수열의 숫자 중 1과 6을 모두 1로, 2와 7을 모두 2으로 바꾼 숫자와 1과 6을 모두 6으로 2과 7을 모두 7로 바꾼 숫자 사이에 가능한 경우를 모두 사전순으로 나열한 다음 그 중 k번째 수열인 비밀번호를 찾기로 했다. 멘붕에 빠진 희현이의 비밀번호를 찾아주자.
조건 : K <= 2^63-1 0 <= 비밀번호의 자리수 <= 60
해결방안
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string input;
long long N, M = 1;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> input >> N;
for (int i = 0; i < input.length(); i++){
if (input[i] == '1' || input[i] == '6'){
input[i] = '1';
M *= 2;
}
else if (input[i] == '2' || input[i] == '7'){
input[i] = '2';
M *= 2;
}
}
if (N > M || N < 0){
cout << -1 << "\n";
}
else{
N -= 1;
for (int i = input.length()-1; i >= 0; i--){
if (input[i] == '1'){
if (N % 2) {
input[i] = '6';
}
N /= 2;
}
else if (input[i] == '2'){
if (N % 2) {
input[i] = '7';
}
N /= 2;
}
}
cout << input << "\n";
}
return 0;
}
k번째 비밀번호를 찾기위해서 가능한 비밀번호의 수열의 경우의 수는 1,2,6,7의 개수를 N개라고 할 때 2^N개이다. 이는 K를 2진수로 표현해 쉽게 해결할 수 있다. 예를 들어 K = 4이면 경우의 수는 0000~1111 까지 이고 0부터 시작하므로 0011번이 4번째 비밀번호임을 알 수 있고 2,3번째 문자만 6 또는 7로 변경해 해결할 수 있다.
Author And Source
이 문제에 관하여(백준 12025 장난꾸러기 영훈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tmdtjq32/백준-12025-장난꾸러기-영훈저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)