문제
양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 106)
출력
각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.
처음 생각
백준에 제출했는데 계속 틀린 이유가 '테스트 케이스의 개수 T'를 간과했기 때문이었다
예제가 한개만 나와있어서 한번만 실행한다고 착각했다
내가 푼 방법
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.readLine(); //T
int n = Integer.parseInt(in.readLine());
String nStr = Integer.toBinaryString(n);
for(int i=nStr.length()-1; i>=0; i--) {
if(nStr.charAt(i)=='1') {
System.out.print(nStr.length()-1-i+" ");
}
}
}
}
-> 이건 틀린 풀이이다 아래의 정답과 비교해서 공부하기 위해 기록한다
그래서 테스트케이스 T의 반복문 안에
정수n을 받고 이진수화해서 1의 위치를 숫자로 나타내는 반복문을 넣었더니 해결되었다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
for(int k=0; k<T; k++) {
int n = Integer.parseInt(in.readLine());
String nStr = Integer.toBinaryString(n);
for(int i=nStr.length()-1; i>=0; i--) {
if(nStr.charAt(i)=='1') {
System.out.print(nStr.length()-1-i+" ");
}
}
}
}
}
-> 이게 맞은 풀이이다
'백준 풀이' 카테고리의 다른 글
[백준 풀이_Java] 4344 평균은 넘겠지 (0) | 2021.08.27 |
---|---|
[백준 풀이_Java] 10870 피보나치수5 (0) | 2021.08.19 |
[백준 풀이_Java] 11720 숫자의 합 (0) | 2021.08.17 |
[백준 풀이_Java] 2839 설탕배달 (0) | 2021.08.04 |
[백준 풀이_Java] 2501 약수구하기 (0) | 2021.07.28 |