백준/Java

[백준 자바] 8741번(이진수 합)

gamzaggang7 2024. 6. 21. 01:16
728x90

난이도 - 브론즈 2

문제

세계적인 이진수 매니아 현수는 오늘도 이진수를 연구하고 있다.

오늘은 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 구해보려고 한다.

k가 주어졌을 때, 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 k가 주어진다. (1 ≤ k ≤ 106)

출력

첫째 줄에 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 이진수로 출력한다.

 


 

처음 구상은 k자리의 최대 2진수("1".repeat(k))를 10진수로 변환하여 1부터 10진수까지의 합을 구하고 그 값을 2진수로 변환하는 거였다. 하지만 이렇게 하니 for문이 많이 돌아 시간초과가 발생했다. 다른 방법을 모색하던 중 출력값들 사이의 규칙을 발견했다.

k=1일 때 출력값 => 1

k=2일 때 출력값 => 110

k=3일 때 출력값 => 11100

k=4일 때 출력값 => 1111000

k가 0인 경우를 제외하고 모든 출력결과가 '1' k개 + '0' k-1개이다.

import java.io.*;

public class Main {
  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 k = Integer.parseInt(br.readLine());

    if (k == 0)
      bw.write(String.valueOf(k));
    else
      bw.write("1".repeat(k) + "0".repeat(k - 1));

    bw.flush();
    br.close();
    bw.close();
  }
}

728x90