긱 챌린지 [SKRZAT] (밑이 -2인 진법)

면접 대비

시간 제한1초메모리 제한128 MB

요약
10진수와 -2진법(위어드 바이너리) 사이를 변환하고 각 질의를 정해진 형식으로 출력한다.
난이도

쉬움10점 중 3점

유형
수학, 구현, 정수론
정답자
아직 제출이 없습니다

문제

긱 챌린지 [SKRZAT]는 두 개의 버튼과 조이스틱이 달린 콘솔로 즐기는 폴란드의 아주 오래된 게임이다. 이름 그대로 이 게임은 이진법으로 소통한다. 한 버튼은 0을, 다른 버튼은 1을 뜻한다. 여기서 한 걸음 더 나아가, 이 게임은 밑(base)이 +2가 아니라 -2인 수 체계를 사용하는데, 이 표현을 “위어드 바이너리(Weird Binary)”라고 부르기로 한다.

위어드 바이너리에서 오른쪽에서부터 00번째로 세었을 때 위치 ii의 비트는 가중치 (−2)i(-2)^i를 가진다. 비트 문자열의 값은 1인 위치들의 가중치를 모두 더한 값이다. 5비트 패턴과 그 값은 다음과 같다.

모든 5비트 패턴을 비트 순서대로 정렬한 표:

비트값비트값비트값비트값
00000001000-81000016110008
00001101001-71000117110019
00010-201010-101001014110106
00011-101011-91001115110117
00100401100-410100201110012
00101501101-310101211110113
00110201110-610110181111010
00111301111-510111191111111

같은 값들을 크기 순으로 정렬한 표:

비트값비트값비트값비트값
01010-1000010-21101061001014
01011-900011-11101171001115
01000-80000001100081000016
01001-70000111100191000117
01110-600110211110101011018
01111-500111311111111011119
01100-400100411100121010020
01101-300101511101131010121

숫자는 화면에 위어드 바이너리로 표시되고, 플레이어는 콘솔에서 0과 1의 흐름으로 답한다. 십진수와 위어드 바이너리 사이를 변환하여 초보자를 돕는 프로그램을 작성하라.

입력

첫 번째 줄에는 질의의 개수를 나타내는 정수 nn이 주어진다. 이어지는 nn개의 줄이 각각 하나의 질의이다.

  • b로 시작하는 줄에는 십진수로 변환해야 하는 위어드 바이너리 문자열이 들어 있다.
  • d로 시작하는 줄에는 위어드 바이너리로 변환해야 하는 십진수 정수가 들어 있다.

모든 값은 15비트 위어드 바이너리로 표현할 수 있으므로, 십진수 범위는 −10922-10922 이상 2184521845 이하이다.

출력

각 질의마다 한 줄씩 출력한다. 질의 종류와 입력 문자열, 그리고 변환 결과를 함께 보여 준다.

  • b 질의의 경우: From binary: <문자열> is <십진수>
  • d 질의의 경우: From decimal: <문자열> is <위어드 바이너리>

입력 문자열은 그대로 다시 출력한다(위어드 바이너리 입력에는 앞자리 0이 있을 수 있다). 출력하는 위어드 바이너리 결과에는 앞자리 0을 붙이지 않으며, 값 00은 0으로 적는다. 위에 보인 간격을 정확히 그대로 맞춘다.

예제1

  1. 예제 1

    입력
    10
    b 1001101
    b 0111111
    b 101001000100001
    b 010010001000010
    b 100110100110100
    d -137
    d 137
    d 8191
    d -10000
    d 21000
    
    예상 출력
    From binary: 1001101 is 61
    From binary: 0111111 is -21
    From binary: 101001000100001 is 19937
    From binary: 010010001000010 is -7106
    From binary: 100110100110100 is 15604
    From decimal: -137 is 10001011
    From decimal: 137 is 110011001
    From decimal: 8191 is 110000000000011
    From decimal: -10000 is 10100100110000
    From decimal: 21000 is 101011000011000