코딩테스트/SWEA
[SWEA D3] 1289. 원재의 메모리 복구하기.py
머밍
2024. 7. 8. 17:31
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
원재가 컴퓨터를 만지다가 실수를 저지르고 말았다. 메모리가 초기화된 것이다.
다행히 원래 메모리가 무슨 값이었는지 알고 있었던 원재는 바로 원래 값으로 되돌리려고 했으나 메모리 값을 바꿀 때 또 문제가 생겼다.
메모리 bit중 하나를 골라 0인지 1인지 결정하면 해당 값이 메모리의 끝까지 덮어씌우는 것이다.
예를 들어 지금 메모리 값이 0100이고, 3번째 bit를 골라 1로 설정하면 0111이 된다.
원래 상태가 주어질 때 초기화 상태 (모든 bit가 0) 에서 원래 상태로 돌아가는데 최소 몇 번이나 고쳐야 하는지 계산해보자.
입력
- 첫 번째 줄에 테스트 케이스의 수 T가 주어진다.메모리의 길이는 1이상 50이하이다.
- 각 테스트 케이스는 한 줄로 이루어져 있으며, 메모리의 원래 값이 주어진다.
출력
- 각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력
- 초기값(모든bit가 0)에서 원래 값으로 복구하기 위한 최소 수정 횟수를 출력
ex
입력
2
0011
100
출력
#1 1
#2 2
Solution
처음 문제 읽을 때는 이해가 안되었는데 쉽게 접근하려고 생각했다.
예시를 보면 0011은 인덱스 2를 한 번 바꾸면 끝까지 바뀌므로 결국 최소 수정 횟수는 1이다.
두번째 예시는 인덱스 0을 바꾸면 011, 한번 더 바꿔야 하므로 인덱스 1를 바꾼다. 뒤까지 한번에 바뀌므로 000이 되기까지 2번 수정되어야한다.
"원래 값으로 복구하기 위한"을 모든 비트가 0인 초기값이 되어야하는 과정이라고 생각하면 쉽다.
즉, cur의 값을 0으로 시작하여 0이면 바꾸지 않다가 1을 만나면(cur와 현재값이 다를 경우) 수정해야하므로 수정 횟수를 증가시킨 뒤 cur값을 현재값으로 바꾼다.
T = int(input())
for test_case in range(1, T + 1):
numbers = list(map(int,input().strip()))
answer = 0
cur = 0
for i in range(len(numbers)):
if numbers[i] != cur:
answer +=1
cur = numbers[i]
print(f'#{test_case} {answer}')