[백준] 3460 이진수 JAVA

·2024년 2월 26일

1일1백준 -Java-

목록 보기
26/60

문제

양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 10^6)

출력

각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.

예제 입력

1
13

예제 출력

0 2 3

내가 했던 풀이 방법

  1. num이 1이 아닐 경우, 무한 while문에 들어간다.
  2. 만약 2로 나눴을 때 나머지가 1일 경우 그 때의 index를 출력해준다.
    3-1. 2로 한 번 더 나눠줬을 때 num이 1이라면 그 때의 index+1을 해주고 무한 while문에서 탈출한다.
    3-2. 2로 한 번 더 나눠줬을 때 num이 1이 아니라면 index를 1 올려주고 다시 2번으로 돌아간다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
        public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n_case = Integer.parseInt(br.readLine());

        int num = 0;
        int index = 0;
        for(int i=0; i<n_case; i++) {
            index = 0;
            num = Integer.parseInt(br.readLine());
            if(num==1) {
                System.out.println("0");
            } else {
                while(true) {
                    if(num%2==1) {
                        System.out.print(index + " ");
                    }
                    num = num/2;
                    if(num==1) {
                        System.out.println(index+1);
                        break;
                    }
                    else {
                        index++;
                    }
                }
            }
        }   
    }
}

회고

오늘 푼 문제가 너무 쉬웠기 때문에 한 문제 더 풀었다.
쓸데없이 삽질을 한 부분이 있는데, 처음에 if(num==1)을 안 해줬을 때, 시간초과 오류가 났다. 그래서 당연히 코드 자체는 맞을거라 생각했는데, if(num==1)을 추가 해주니까 정답이었다. 그래도 빠르게 오류를 알아서 오래 걸리지는 않았고, 문제 풀이 방법을 생각하는 것도 오래 걸리지 않았다. (당연하긴 하다. 쉬운 문제니까) 백준 예제가 조금만 더 친절했으면 좋겠다.. 내가 틀린 걸 인지하기까지가 너무 힘들다ㅠ

profile
Frontend🍓

0개의 댓글