[SWEA][D3][#01289] 원재의 메모리 복구하기

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

원재가 컴퓨터를 만지다가 실수를 저지르고 말았다. 메모리가 초기화된 것이다.

다행히 원래 메모리가 무슨 값이었는지 알고 있었던 원재는 바로 원래 값으로 되돌리려고 했으나 메모리 값을 바꿀 때 또 문제가 생겼다.

메모리 bit중 하나를 골라 0인지 1인지 결정하면 해당 값이 메모리의 끝까지 덮어씌우는 것이다.

예를 들어 지금 메모리 값이 0100이고, 3번째 bit를 골라 1로 설정하면 0111이 된다.

원래 상태가 주어질 때 초기화 상태 (모든 bit가 0) 에서 원래 상태로 돌아가는데 최소 몇 번이나 고쳐야 하는지 계산해보자.


입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 메모리의 원래 값이 주어진다.

메모리의 길이는 1이상 50이하이다.


출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

초기값(모든bit가 0)에서 원래 값으로 복구하기 위한 최소 수정 횟수를 출력한다.


예제

입력

2
0011
100


출력

#1 1
#2 2


My Sol

T = int(input())
for tc in range(1, T+1):
    txt = input()
    f = 0
    for t in txt:
        if int(t)!=f%2:
            f+=1
    print(f'#{tc} {f}')

D3의 난이도가 무색하게 정말 쉽게 푼 문제였다. 모든 수가 0으로 초기화되어 있고, 특정 자리에서 1로 변하면 그 뒤는 또 1의 연속, 또 0이 온다면 0의 연속으로 조작할 수 있다면, 기존 것과 다른 것을 마주하면 cnt를 올리고 기존 것을 현재 마주친 것으로 바꿔주면 되겠다. 나는 2진수를 십분 활용함과 동시에 2개의 상황을 한 번에 표현하기 위해 0부터 시작하는 f 변수를 만들어 기존 것과 다르다면 f에 1을 추가하도록 하였다. 이후 매 반복마다의 판단에서 f를 2로 나눠준 나머지가 현재 판단하는 것과 같지 않다면 다시 f를 늘려주면 되는 것이다.

이 f 변수가 곧 모든 수를 다 조회했을 때 몇 번을 바꾸었는지에 대한 지표가 되기도 하기 때문에 이를 출력 형식에 맞춰 출력해주면 되겠다.


결과

PASS

댓글남기기