더 많이 실패하기

백준 2089번 -2진수 자바 Java (☆공부 253일차) 본문

알고리즘/백준

백준 2089번 -2진수 자바 Java (☆공부 253일차)

김발자~ 2023. 4. 9. 17:58
반응형

2089 -2진수

https://www.acmicpc.net/problem/2089

 

2089번: -2진수

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 110

www.acmicpc.net

 

 

 


백준 2089번 문제 -2진수


문제


 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 128 MB 9794 4569 3748 45.663%

문제

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.

10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.

입력

첫 줄에 10진법으로 표현된 수 N이 주어진다.

출력

-2진법 수를 출력한다.

제한

  • -2,000,000,000 ≤ N ≤ 2,000,000,000

예제 입력 1

-13

예제 출력 1

110111

 

 

 


과정 생각해보기 & 오답


 

https://gimbalja.tistory.com/196

 

공부 114일차: 백준 2089번 -2진수 자바 java

2089 -2진수 https://www.acmicpc.net/problem/2089 2089번: -2진수 -2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다.

gimbalja.tistory.com

4달 전에 푼 문제

 

누르면 이미지 출처로 이동

우선 -2진수를 구현하기 전에, 10진수를 2진수로 바꾸는 방법에 대해 알아봐야 한다

그림에서 보는 것처럼 주어진 10진수를 계속해서 2로 나눈 후, 몫이 2보다 작아지면 몫과 지금까지의 나머지를 순서대로 적는다

10진수를 8진수로 변환할 때도 주어진 10진수를 계속 8로 나눈다

 

즉, -2진수는 주어진 숫자를 계속 -2로 나누어야 한다는 소리가 된다

-2로 나누고 몫은 올림을 해야 하는데, 그림에서처럼 음수일 때는 올림을 해야 원하는 결과를 얻을 수 있기 때문이다

 

이렇게 몫과 나머지를 다 구한 후엔 2진수를 구하는 그림의 화살표처럼 뒤집어서 출력한다

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main{
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        int n = Integer.parseInt(br.readLine());
        
        if(n == 0) {
            System.out.println(0);
        }else {
            while(n != 1) {
                sb.append(Math.abs(n % -2));
                n = (int)Math.ceil((double)n/-2);    // ★
            }
            
            sb.append(n);
            System.out.println(sb.reverse());
        }
        
        br.close();
    }
 
}
 
cs

 

 

 


이것저것 찾아봤지만 현재 풀이가 가장 좋아보인다

반응형
Comments