본문 바로가기

알고리즘/구름 edu

[구름LEVEL 유형 트레이닝 / 구현] 계수기 만들기 (python)

728x90

문제 설명

각 자리마다 최댓값이 다른 숫자판을 가진 계수기가 있다. 버튼을 누를 때마다 가장 오른쪽 자리 숫자가 1씩 증가한다. 계수기에 표시되는 숫자의 초기 상태와 각 자리의 최댓값이 주어질 때, k번 버튼을 누른 뒤 계수기 각 자리에 표시되는 숫자를 구한다.

 

각 자리의 숫자가 표시할 수 있는 숫자가 최댓값보다 커지면 0으로 초기화하고 왼쪽 자리 숫자를 1 증가시킨다. 만약 가장 왼쪽 자리 숫자가 최댓값을 넘어간다면 왼쪽 자리가 없기 때문에 올림을 전파하지 않는다.

풀이

N = int(input())
max_value = list(map(int, input().split()))
present_value = list(map(int, input().split()))
K = int(input())

cnt = 0

while (cnt < K):
	cnt += 1
	index = N - 1
	for i in range(N):
		if present_value[index] == max_value[index]:
			present_value[index] = 0
			index -= 1
		else:
			break
	
	if index == -1:
		continue
	
	present_value[index] += 1
	
print(*present_value, sep='')

 

계수기의 자리 수, 각 자리의 최댓값과 초기 값, 버튼 누르는 횟수를 입력받는다.

 

while문을 돌면서 cnt == k가 되는 순간 반복문을 종료한다.

반복문을 한번 돌 때마다 cnt는 +1을 해주고, 인덱스는 현재 가리키는 계수기의 자리를 의미하는데 초기에는 가장 오른쪽 자리를 가리킨다.

 

안쪽 반복문 for 내에서는 이번에 증가할 자리의 인덱스를 찾는다. 현재 인덱스가 가리키는 값이 최댓값인 경우 그 값은 0으로 바꾸고 인덱스는 왼쪽으로 이동시킨다. 현재값이 최댓값이 아닌 경우 for문을 나간다.

 

for문을 나간 뒤에는 현재 인덱스가 가리키는 값을 +1 한다.

 

while문을 나와서 present_value를 공백없이 출력하면 정답을 구할 수 있다.

(sep은 separation, 구분자를 의미한다.)

 

 

주의할 점은 가장 왼쪽 자리 숫자가 최댓값을 넘었을 경우 index는 -1이 되는데, 파이썬의 경우 배열[-1]은 가장 끝(오른쪽) 값을 가리키기 때문에 예외처리를 하지 않으면 정답과 다른 값이 출력된다. 따라서 이 부분은 예외처리를 했다.

반응형