[Java] 이진수 (백준 3460번)

minjung·2022년 11월 26일
0

📖문제

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

  • 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 10^6)
  • 각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.

✏️내 풀이

  1. 테스트 케이스의 개수 T를 구한다.
  2. 반복문을 T번 실행한다.
  3. 입력값을 받는다.
  4. 입력값을 2로 나눈 후, 나머지가 1이면 이진수로 나타냈을 때 1이고, 그렇지 않으면 0인 것을 사용해 반복문을 돌린다.
    (원래는 4. 10진수를 이진수로 바꾼다.로 하려고 했으나, 인덱스값을 구하는데서 삽질하던 와중 친구가 다른 방법을 알려줌 !)
  5. 2로 나눈 나머지가 0이 될 때까지 반복한다.
13 -> 1101

13%2 = 1
13/2 = 6

6%2 = 0
6/2 = 3

3%2 = 1
3/2 = 1

1%2 = 1
1/2 = 0
  1. 반복하면서 인덱스값을 1씩 추가한다.
package lv_1;

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

public class B3460 {
	public static void main(String[] args) throws Exception {

		//성능 향상을 위해 Scanner 대신 BufferedReader를 사용한다.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		//t의 값을 구한다. readLine은 String값이기 때문에 int로 변환한다.
		int T = Integer.parseInt(br.readLine());

		for(int i=0;i<T;i++) { //T번 반복
			int n = Integer.parseInt(br.readLine()); //정수 n을 입력받는다.

			int index=0; //인덱스값을 구하기 위한 변수

			while(n>0) { //나누는 수가 0 이상이면 실행
				if(n%2==1) { //나머지가 1이면 이진수로 나타냈을 때 1이 됨
					System.out.print(index + " "); //인덱스값 출력 (줄바꿈 하지 않기 위해 print 사용)
				}
				n/=2; //n은 n를 2로 나눈 몫
				index++; //인덱스값 +1 하고

				//반복
			}
			System.out.println(); //하나의 n이 끝나면 줄바꿈
		}
	}
}

🤓배운 점

Java 10진수 -> 2진수 변환

  • Integer.toBinaryString(int i)

맨 처음에는 Integer.toBinaryString(int i)를 사용해서 10진수를 2진수로 바꾸려고 했다.
반환타입은 String

  • %, /

정수를 2로 나누었을 때 나머지가 1이면 이진수로 나타냈을 때 1이고, 0이면 이진수로 나타냈을 때 0인 점을 사용해서 변환값을 구할 수 있다.
몫이 0이 될 때까지 반복하면 된다.

String의 각 인덱스 값 구하기

  • charAt()

문자열에서 한글자 값만 구하고 싶다면 charAt(index)을 사용하면 된다.
반환타입은 char
값 비교를 하고 싶으면 아스키코드값으로 비교해야 한다.

0개의 댓글