[백준]_12025_장난꾸러기 영훈이

` 이진법을 활용한 방법

01로 이진수를 만들듯이 16과 27을 각각 이진수처럼 생각하여 풀이

  1. 1267이 나오는 자리 수 및 개수 저장, 67은 12로 바꿈
  2. $2^{1267개수} < K - 1$ 이면 -1 출력
  3. 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);
	}

}
updatedupdated2021-03-032021-03-03
Load Comments?