✅ 문제

문자열 형태의 2진수를 입력받아 10진수로 바꾸는 프로그램을 작성하시오.
✅ 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int base = 1;
int result = 0;
for (int i = str.length()-1 ; i >= 0; i--) {
if(str.charAt(i) == '1'){
result += base;
}
base *= 2;
}
System.out.println(result);
}
}
✅이진수를 십진수로 바꾸는 법
- 이진수는 0또는 1로 이루어져 있다. 이진수의 맨 오른쪽 끝자리는 2의 0제곱의 가치를 가지며, 왼쪽으로 갈수록 2의 1제곱, 2제곱, 3제곱으로 자리의 가치가 늘어간다.
- 이진수의 각 자리에 해당하는 값과 해당 자리의 가치를 곱한 후 모두 더한다. 여기서 이진수는 0과 1로만 이루어져있다고 했기 때문에 어차피 0인 자리는 신경쓸 필요가 없다. 0에 어떤 가치를 곱하든 0이 되기 때문이다. 즉, 우리에게 유의미한 데이터는 이진수에서 1인 자리이다.
8자리 이진수 자릿수는 표의 맨 윗줄은 CharAt(i)의 인덱스 i이다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
64*1 + 8*1 + 4*1 + 2*1 + 1 = 77 |
✅추론 과정
- int base = 1; : 이진수의 각 자리의 가치를 나타내는 변수를 초기화 해 준다. 여기서는 2의 0제곱으로 초기화 해주므로 1이다.
- int result = 0; : 변환된 십진수를 저장할 변수를 초기화 (결과값 저장할 변수)
- for (int i = str.length()-1 ; i >= 0; i--) { : 이진수의 각 자리를 거꾸로 탐색한다. 즉 7번인덱스인 2의 0제곱 자리부터 0번인덱스인 2의 7제곱 자리로 끝자리부터 읽어온다(오른쪽에서 왼쪽으로 읽어온다).
- if(str.charAt(i) == '1'){ result += base; } : 현재 위치의 이진수가 1이라면, 해당 자리의 값을 결과에 누적시켜 더해준다. 이는 이진수의 해당 자리가 1인 경우에만 그 자리의 가치를 결과에 더해준다는 뜻이다.
- base *= 2; : 다음 자리의 가치를 계산하기 위해 base 값을 2배로 증가시킨다.
- System.out.println(result); : 변환된 십진수를 출력한다.
'코딩테스트 > JavaFestival(스마트인재개발원)' 카테고리의 다른 글
[자바페스티벌] 30번 - 문장에 포함된 알파벳의 빈도 구하는 프로그램 (대소문자 구별x) (0) | 2024.03.29 |
---|---|
[자바페스티벌] 29번 - 두 수의 합 맞추기 / 기회는 5번! (0) | 2024.03.29 |
[자바페스티벌] 27번 - ox 여부 입력 받아 총점을 구하는 프로그램 만들기 (0) | 2024.03.28 |
[자바페스티벌] 26번 - 세자리수 * 세자리수 연산 (세자리수끼리 곱하기) (1) | 2024.03.28 |
[자바페스티벌] 25번 - 숫자 입력 받아 대시의 개수 출력하는 프로그램(대시문자 '_') (0) | 2024.03.28 |