본문 바로가기

Python 배우기

[외계어 배우기] 반복문: 무한 루프(문제#8 Slot Machines)

자, 그럼 이제 Chapter4 반복문: 무한 루프에 대해 지금까지 배운 것들을 정리해 보자. 일단 Chapter 3 반복문: 한정 루프를 공부하기 시작하며, 한정은 Iteration의 이미이고 무한은 Recursion의 의미라고 이야기한 것을 기억하자.

덧, 솔직히 말하자면 이 블로그를 정말 열심히 열심히 작성하다가 갑자기 노트북이 꺼져서 저장조차 안되고 다 날아가버렸다.

 

이번 장은 슬롯 머신 문제를 풀면서 recursive 루프에 대해 먼저 배우기 시작할 것이다. 

 

도전 과제: 마르타가 n의 칩을 가지고 슬롯 머신을 플레이 하는데, 슬롯 머신은 3개가 있고 순서대로 플레이할 것이다. 첫 번째 슬롯 머신을 플레이한 후 두 번째 슬롯 머신을 플레이하고 그 후 세 번째 슬롯 머신을 플레이한 다음 다시 첫 번째 슬롯 머신을 플레이하는 식이다. 슬롯 머신을 한번 플레이할 때마다 칩이 1개 사용된다.

슬롯 머신의 규칙:

첫 번째 슬롯 머신에서 35번 플레이하면 칩을 30개 얻게 된다.

두 번째 슬롯 머신에서 100번 플레이하면 칩을 60개 얻게 된다.

세 번째 슬롯 머신에서 10번 플레이하면 칩을 9개 얻게 된다.

 

입력: 4줄
칩 수(0 < n < 1000)
첫 번째 슬롯 머신이 마지막으로 칩을 지불한 후 플레이된 횟수.
두 번째 슬롯 머신이 마지막으로 칩을 지불한 후 플레이된 횟수.
세 번째 슬롯 머신이 마지막으로 칩을 지불한 후 플레이된 횟수.

(마지막으로 칩을 지불한 후 플레이된 횟수란, 각 머신마다 칩을 지불할 정도로 플레이한 후 다시 초기값(0)으로 플레이수가 바뀌기 때문이다.)

 

나는 사실 공부를 혼자 하는게 아니라 선생님과 같이 하다보니 선생님의 가르침에 따라 여러 가지 문제해결 방법을 시도해보고 있지만, 일단 선생님과의 공부는 무조건 외우고 이해해야 하기 때문에 이해를 위해서 정리를 책을 기반으로 하겠다.

 

recursive 루프를 사용하는 이유는 for 루프를 사용할 수 없기 때문이다. 무슨 말인고 하니, for 루프는 문자열과 같이 일련의 연속된 것들을 반복하거나 일정 범위의 정수들을 가지고 지정된 횟수만큼 반복할 때 사용하는 것이 더 낫지만, 그렇지 않은 경우에는 while 루프를 사용한다.

 

while 루프는 Boolean 연산에 따라 반복을 한다. 즉 Boolean 표현식이 True이면 루프가 1번 반복되고, False이면 반복이 끝난다.

코드를 보면 이해하기가 쉬을 것이다.

num을 0으로 할당하고 num이 5보다 작은 동안 num을 출력하는데, num은 1씩 증가한다. 

 

쉽게 이해했는데, 왜 아래 문제를 이해 못하겠지?

여기에서는 처음 n = 3으로 할당해 주었다. 그리고 n이 0보다큰 동안 만약 n이 5을 참조한다면 n은 -100이 되는 것까지는 알겠는데, 왜 3, 4, -100에서 끝났지?...... 라고 생각하고 있었는데, 아~~~~~~~ 깨달았다. n은 0보다 커야 하는데, n이 -100이 되는 순간 0보다 작아져서 반복이 끝났구나~ 복습이 이래서 중요하다!!! 왜 이런 생각을 못했을까???

 

위에 두 코드에서 알 수 있듯이, while 루프의 경우 값을 반복할 변수는 while 루프 전에 선언된다. 

 

while 루프도 for 루프와 같이 중첩할 수 있다. 중첩에 대해서 기억할 것이다. outter가 반복되는 동안에 inner가 반복되는데 inner context가 해결하고 나서 outter context를 해결한다는 뜻이다. 

 

아래 코드도 보자.

 

이 코드가 이전 코드와 다른 부분은 변수 y를 outter 루프 전에 선언한 것이다. 그럼에도 y가 3보다 작은 수의 반복동안 y값을 초기화하지 못하므로, x의 값이 0이고 y의 값이 1과 2 값을 갖고 바로 반복이 멈춰버렸다.

 

자, 그럼 다시 문제로 돌아가보자.

문제를 보고 우리가 알 수 있는 것은 해당 문제에서 반복해서 일어나는 일들은 마르타가 가지고 있는 칩이 모두 소진되기 전에만 가능하다는 뜻이다. 즉, 칩이 모두 소진되면 반복이 끝난다. 

 

지금까지 배운 내용으로 문제를 해결해 보자.

 

내가 작성한 코드든 남이 작성한 코드든, 예제 코드든 간에 코드를 보면서 한줄씩 풀어서 글로 작성해보는 것이 나에게는 학습에 큰 도움이 되고 있다.  그럼 오늘도 한줄씩 노트에 작성 gogo!

 

반응형