백준알고리즘
- 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 괴발개발 개발일지
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘] #6810. ISBN (by JAVA and node.js) (0) | 2022.04.25 |
---|---|
[백준알고리즘] #5928. Contest Timing (by JAVA and node.js) (0) | 2022.04.22 |
[백준알고리즘] #5596. 시험 점수 (by JAVA and node.js) (0) | 2022.04.22 |
[백준알고리즘] #5575. 타임 카드 (by JAVA and node.js) (0) | 2022.04.22 |
[백준알고리즘] #5543. 상근날드 (by JAVA and node.js) (0) | 2022.04.22 |