본문 바로가기
코딩 테스트/[JAVA] 백준

[JAVA] 백준 5893번 17배

by M개발자 2022. 3. 10.
반응형

17배

문제

 

상근이는 이진수 곱셈에 어려움을 겪는 여자친구를 위한 프로그램을 만들려고 한다.

상근이의 여자친구는 항상 이진수에 17을 곱한다. 즉, 이진수 N이 입력으로 들어오면 17을 곱한 다음 이진수로 출력하는 프로그램을 작성하시오.


예제 입출력

 

입력 출력
10110111 110000100111

 


코드

흐름

1. 이진수를 입력받는다.

2. 몇 개의 0이 들어오든 1이 없으면 무조건 0을 반환한다.

3. 이진수를 십진수로 변환한다.

4. 변환한 십진수에 17을 곱한다.

5. 곱한 수를 다시 이진수로 변환한다.

 

참고 ✨

1. N은 최대 1000자리인 이진수이다.

- int형을 넘어가는 범위이므로 이진수를 String으로 받아 사용했다.

- int형을 사용할 수 없으므로 정수를 사용할 때 BigInteger를 사용하여 계산했다. 

 

2. 2진수 → 10진수 변환, 10진수 2진수 변환을 해야한다. 

- 코드가 길어질 경우에는 하나의 기능을 하는 메소드로 구현하는 게 좋다.

[JAVA] 2진수 → 10진수 / 10진수 → 2진수 변환 코드 | 이진수 십진수 2진수 십진수

 

코드 설명은 주석으로 달아두었다. 

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // int 범위를 넘어서서 String으로 받음
        String a = scanner.next();
        
        // 0이 들어오는 경우는 없다하여 0, 00, 000 어떤 형태든 1을 포함하지 않으면 0을 반환하도록 처리했다.
        if(!a.contains("1")) System.out.println("0");
        else{
        	// 1. 2진수를 10진수로 변환한다. → twoToTen 메소드
            // 2. 변환한 10진수와 17을 곱하여 BigInteger로 저장한다. → int 범위 벗어남
            // 3. 17을 곱한 10진수를 다시 2진수로 변환한다.
            BigInteger tenMul17 = twoToTen(a).multiply(BigInteger.valueOf(17));
            String two17 = tenToTwo(tenMul17);
            System.out.println(two17);
        }

    }
    
    // 2진수 -> 10진수
    public static BigInteger twoToTen(String two){
        BigInteger sum = new BigInteger("0"); // 10진수로 변환한 값을 저장할 변수
        BigInteger i = new BigInteger("1");

        while (two.length() != 0) {
            int num = Integer.parseInt(two.substring(two.length() -1)); // 마지막부터 한개씩 int형으로 변환
            sum = sum.add(i.multiply(BigInteger.valueOf(num)));// 1의 자리 수와 i 곱하여 더함
            i = i.multiply(BigInteger.valueOf(2)); // 2진수이기에 i에 2를 곱해줌
            two = two.substring(0, two.length() - 1); // 사용한 1의 자리 지우기
        }
        
        return sum;
    }

    // 10진수 -> 2진수
    public static String tenToTwo(BigInteger ten) {
        StringBuilder binary = new StringBuilder(); // 2진수로 변환한 값 저장할 변수

        while (ten.compareTo(BigInteger.valueOf(0)) == 1) {
            // String binary = (a % 2) + binary;
            binary.insert(0, (ten.remainder(BigInteger.valueOf(2))));
            ten = ten.divide(BigInteger.valueOf(2));
        }
        return binary.toString();
    }
}

 


 

 

5893번: 17배

첫째 줄에 이진수 N이 주어진다. N은 최대 1000자리인 이진수이며, 0이 들어오는 경우는 없다.

www.acmicpc.net

 

반응형

댓글