728x90
난이도 - 골드 4
문제
0과 1로 구성된 이진수가 있다. 이 이진수에서 0을 10으로, 1을 01로 동시에 치환하면 길이가 두 배인 이진수를 얻을 수 있다. 이러한 이진수들을 차례로 나열하면 하나의 이진수 수열이 된다. 편의상 시작 수는 1이라고 하자. 처음 몇 개의 이진수들을 구해 보면,
1 → 01 → 1001 → 01101001 → …
이 된다.
N이 주어졌을 때, N번째 이진수에서 연속된 0들의 그룹이 몇 개나 있는지 알아내는 프로그램을 작성하시오. N=4일 경우의 이진수는 01101001이고, 따라서 이 안에는 연속된 0들이 세 그룹 있게 된다.
입력
첫째 줄에 정수 N(1 ≤ N ≤ 1,000)이 주어진다.
출력
첫째 줄에 답을 출력한다.
728x90
2진수를 나열하고 0의 그룹 개수를 찾는 코드를 작성하면 메모리 초과가 뜬다. 규칙을 찾으면 쉽게 풀 수 있다.
N | 2진수 | 0 그룹 개수 |
1 | 1 | 0 |
2 | 01 | 1 (0*2+1) |
3 | 1001 | 1 (1*2-1) |
4 | 01101001 | 3 (1*2+1) |
5 | 1001011001101001 | 5 (3*2-1) |
6 | ... | 11 (5*2+1) |
7 | ... | 21 (11*2-1) |
N이 짝수일때 0 그룹 개수는 N-1번째 0 그룹 개수 * 2 +1이고,
N이 홀수일때 0 그룹 개수는 N-1번째 0 그룹 개수 * 2 -1이다.
import java.io.*;
import java.math.BigInteger;
public class Main2226 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
bw.write(String.valueOf(zeroGroup(N)));
bw.flush();
br.close();
bw.close();
}
static BigInteger zeroGroup(int n) {
int i = 1;
BigInteger count = BigInteger.ZERO;
while (i < n) {
if (i % 2 == 1)
count = count.multiply(BigInteger.TWO).add(BigInteger.ONE);
else
count = count.multiply(BigInteger.TWO).subtract(BigInteger.ONE);
i++;
}
return count;
}
}
728x90
'코딩테스트 > 백준-Java' 카테고리의 다른 글
[백준 자바] 1016번(제곱 ㄴㄴ수) (0) | 2024.06.24 |
---|---|
[백준 자바] 6588번(골드바흐의 추측) (0) | 2024.06.23 |
[백준 자바] 1373번(2진수 8진수), 2998번(8진수) - 2진수를 8진수로 바꾸기 (0) | 2024.06.19 |
[백준 자바] 2738번(행렬 덧셈) (1) | 2024.05.05 |
[백준 자바] 1260번(DFS와 BFS) (3) | 2024.04.20 |