728x90
반응형

백준알고리즘

- Bronze 4 -

 #5893. 17배 by JAVA and node.js 

 


 

문제

출처: https://www.acmicpc.net/problem/5893 

 


 

접근 방법

문제가 짧은데도 여러 번 봤다.. 입력값을 10진수로 바꿔서 17배를 하고 2진수로 바꾸라는 얘기인지, 아니면 2진수로 들어온 값을 하나의 수로 생각하고 17배를 한 다음 이진수로 바꾸라는 얘기인지..

물론 전자가 맞지만, 항상 이진수에 17을 곱한다길래,,

 

어쨌거나 이번 문제의 핵심은 Math.pow()! 여기에 BigInteger를 곁들인,,

 

로직을 보자면..

- 입력값 이진수를 String값으로 받는다.

- BigInteger 변수 선언 및 초기화를 한다.

- 입력값의 길이만큼 for 문을 돌리는데, charAt(i)를 이용하여 i번째 값이 1이라면 오른쪽부터 n.length() - (i+1)번째이므로 2를 그만큼 제곱해준다.(말이 어렵지만 코드를 보면 된다. .pow()이용)

- 새로운 BigInteger 변수를 선언하고 십진수로 변환된 값에 17배를 해준 값으로 초기화

- 2진수로 변환할 때 사용할 String 선언 및 초기화

- 17배 해준 값이 0이 아닐때까지 반복하는데(while), 그 값을 2로 나눈 나머지를 String에 붙여주고, 값은 2로 나눠준다.

- 2진수로 바꾼 값이 거꾸로 붙어있으므로 for문과 charAt을 이용해 출력해준다.

 


 

풀이

▶ JAVA

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

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String n = scan.next();
        scan.close();

        BigInteger big = new BigInteger("0");
        for (int i = 0; i < n.length(); i++) {
            if (n.charAt(i) == '1') { // i번째 값이 1이라면
                // 2^(n.length() - (i+1))을 더해준다.
                big = big.add(new BigInteger("2").pow(n.length() - (i + 1)));
            }
        }

        BigInteger result = big.multiply(new BigInteger("17"));
        String last = "";
        while (result != BigInteger.valueOf(0)) { // result값이 0이 아닐때까지 반복
            // result값을 2로 나눈 나머지(1 or 0)를 String last에 붙여줌
            last += result.mod(BigInteger.valueOf(2));
            // result값을 2로 나눠서 다시 저장
            result = result.divide(BigInteger.valueOf(2));
        }
        for (int i = last.length() - 1; i >= 0; i--) {
            // 거꾸로 출력
            System.out.print(last.charAt(i));
        }
    }
}

거꾸로 출력이라는 얘기는 예를들어 BigInteger가 2라면 2%2 = 0 , 2/2 = 1 >> 1%2 = 1, 1/2 = 0 으로 last = "01"이 된다.

하지만 2를 2진수로 표현하면 10이 맞으므로 거꾸로 출력해야 한다. 다른 숫자 역시 마찬가지.

 

▶ node.js

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim();

var bin = "0b" + input; // BigInt형에서 2진수에 관한 계산을 할 때 binary 형태로 바꿔서 계산해야하는데, 이를 위해 "0b"를 추가함.
var result = (BigInt(bin) * 17n).toString(2); // toString(2)를 이용해 2진수로 바꾼 값을 result에 저장

console.log(result);

node.js의 경우 훨씬 간단하다.

입력값을 BigInt로 값을 바꿔준 후 17n을 곱한 값을 toString(2)로 2진수로 바로 바꿀 수 있다.


 

결과

 


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

 

 

728x90
반응형

+ Recent posts