알고리즘 문제풀이/Beakjoon

백준 3460. 이진수 (JAVA)

joah.k 2023. 3. 1. 02:12
728x90

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

 

3460번: 이진수

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

www.acmicpc.net

 

이진수 

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 13758 7476 6500 55.522%

문제

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

입력

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

출력

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

예제 입력 1 복사

1
13

예제 출력 1 복사

0 2 3

 

 


풀이 : 이진수를 찾는 과정에서 나머지가 1인 위치를 찾는 문제. 

양의 정수 n을 2로 나누어 1이 나올 때까지 나누기를 반복하며, 나누기를 할 때마다 index가 증가하며 

나머지가 1인 경우만 index를 뽑는 풀이법으로 풀었다. 

 

주어진 수를 가지고 while문을 돌려야 하기에 처음엔 이렇게 풀었는데... 

 

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    // 백준 3460. 이진수
    public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        for(int i=0; i<t; i++){
            int n = Integer.parseInt(br.readLine());
            int x = n;
            int index= 0;
            while (x/2!=1){
                if(n%2==1) {
                    System.out.print(index + " ");
                }
                n = n/2;
                index ++;
            }
        }
    }
}

 

시간 초과 오류가 떴다. 

이유는..

x/2!=1은 x가 2로 나누어 떨어지지 않는 경우에만 반복문을 실행하므로, x가 2의 제곱수일 경우만 제대로 동작한다.

문제는 x가 2의 제곱수가 아니라면 while문이 끝나기 전에 마지막 1의 위치가 출력되지 않게 된다는 것이다.

 

따라서 x>0으로 변경하면,  1이 되기까지 반복을 계속 할 것이기에 

다음과 같이 수정하였다. 

 

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

public class Main {
    // 백준 3460. 이진수
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            int index = 0;
            while (n > 0) {
                if (n % 2 == 1) {
                    System.out.print(index + " ");
                }
                n = n / 2;
                index++;
            }
            System.out.println(); // add a new line after printing the indices for each test case
        }
    }
}
 

 

728x90