` 이진법을 활용한 방법
01로 이진수를 만들듯이 16과 27을 각각 이진수처럼 생각하여 풀이
- 1267이 나오는 자리 수 및 개수 저장, 67은 12로 바꿈
- $2^{1267개수} < K - 1$ 이면 -1 출력
- K/2를 계속 하면서 나머지가 1이면 12를 67로 바꾼다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B12025 {
static long K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
char[] arr = br.readLine().toCharArray();
int[] num = new int[arr.length];
int cnt = 0;
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] == '1' || arr[i] == '2' || arr[i] == '6' || arr[i] == '7') {
// 위치 및 개수 저장
num[cnt++] = i;
// 67이면 12로 바꾸기
if (arr[i] == '6')
arr[i] = '1';
else if (arr[i] == '7')
arr[i] = '2';
}
}
K = Long.parseLong(br.readLine());
K--;
long maximum = (long) Math.pow(2, cnt);
// 범위 넘어갈 경우 out
if (maximum < K) {
System.out.println(-1);
return;
}
cnt = 0;
while (K > 0) {
// K를 2로 나누면서 나머지가 1이면 해당자리의 숫자를 바꿈
if(K%2==1) {
if (arr[num[cnt]] == '1') arr[num[cnt]] = '6';
else if (arr[num[cnt]] == '2') arr[num[cnt]] = '7';
}
K/=2;
cnt++;
}
for(char c : arr)
sb.append(c);
System.out.println(sb);
}
}
|