문제 풀이/백준

[백준]3460번. 이진수(JAVA)

27200 2024. 4. 11. 22:23

https://www.acmicpc.net/problem/3460


문제


풀이

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        for(int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());
            StringBuilder sb = new StringBuilder();
            while(num > 0) {
                if(num % 2 == 0) {
                    sb.append("0");
                }else{
                    sb.append("1");
                }
                num /= 2;
            }

            for(int j = 0; j < sb.length(); j++) {
                if(sb.charAt(j) == '1') {
                    System.out.print(j + " ");
                }
            }

            System.out.println();
        }

    }
}

 

2진수를 구하는 법만 알면 간단한 문제이다.

4를 2진수로 변환하는 방법에 대해 생각해 보자.

4 / 2 = 2... 0

2 / 2 = 1... 0

1 / 2 = 0... 1

이런 식으로 몫이 0이 될 때까지 2로 나눈 뒤 나머지를 역순으로 쭉 올리면 된다.

즉 4의 2진수는 100이 된다.

 

문제에서 2로 나눈 나머지를 먼저 계산한 뒤에 0이면 sb에 0을 추가하고, 1이면 1을 추가해 준다.

여기서 문제가 될 수 있는 지점은 2진수의 작성 방법과 역순으로 추가되고 있다는 것이다.

정순으로 돌리고 싶다면. reverse() 메서드를 쓰면 되겠지만 문제에서 원하는 것은 등장한 위치이기 때문에 인덱스를 편하게 사용하기 위해서 역순인 상태로 두고 for반복문을 통해 출력해 주면 된다.

 

최종적으로 다음 테스트를 위한 줄 바꿈까지 진행해 주면 마무리된다