어느새 Chapter3 반복문에 대해서 배울 차례이다.
이 책에서 3장의 제목은 "반복문: 한정 루프"이고 4장의 제목은 "반복문: 무한정 루프"이다. '한정', '무한정'이라는 용어 때문에 'limit', 'unlimit'이라는 의미를 떠올리기 쉬운데, 여기서 말하는 '한정'이란 'Iteration'을 말한다. 즉, 계획된 혹은 규칙이 있는 루프를 의미하는 것이다. 그렇다면 '무한정'은? 'Recursin', 즉 매번 판정해야 하는 루프를 말하는 것이다.
여하튼, 문제5# Three Cups(야바위)에 대해 알아보자.
야바위라는 말에서 알 수 있듯이, 밖에서 볼 수 없는 엎어진 컵 중 어느 컵 안에 공이 위치했는지 찾는 문제이다.
도전 과제: 불투명한 컵이 3개 있고, 컵은 왼쪽(위치1), 가운데(위치2), 오른쪽(위치3)이다. 공은 가장 왼쪽 컵 안에 있다. 야바위꾼이 컵의 위치를 교환할 때 공의 위치를 추적하는 문제이다.
컵을 교환하는 유형은,
A 왼쪽 컵과 가운데 컵 교환
B 가운데 컵과 오른쪽 컵 교환
C 왼쪽 컵과 오른쪽 컵 교환
쉽게 말해서,
입력: 입력은 한 줄이며(최대 50자), 각 문자는 야바위꾼이 수행하는 위치 교환 유형(A, B, C)을 나타낸다.
출력: 공의 위치(왼쪽 컵: 1, 가운데 컵: 2, 오른쪽 컵: 3)
일단 지금까지 배운 것을 활용해서 이 문제를 생각해 보자.
생각을 정리할 때 아직은 노트에 직접 손으로 작성하는 것이 편해서 사진으로 남겨 보았다.
이렇게 되면 각 위치에 대해 아주아주 많은 elif가 쌓여 나갈 것이다. 여기 문제에서는 컵이 3개니까 망정이지 컵이 10개면? 100개면? 엄청나게 길고 복잡한 코드가 탄생할 것이 분명하다.
그렇다면 왜 루프(Loop)를 써야 하는 지 분명해졌다. 중요한 것은 해결해야 하는 문제에서 반복 가능한 것을 찾는 것이다.
자 그럼, 이제 for 루프에 대해 알아보자. (파이썬에서는 for 루프만 쓰는지는 모르겠지만, 이 책에서는 for 루프만 등장한다.)
for 루프를 사용하면 시퀀스(연결되어 있는 세트, 문자열) 요소들을 각각 처리할 수 있다. 무슨 말인지 잘 모르겠지만 일단 예를 보자.
secret_word는 'olive'로 정해두었고, for 루프를 이용했다. for 다음에는 루프 내에서 사용할 변수 이름을 쓴다. 루프 변수는 루프가 진행됨에 따라 다른 요소를 참조하는 변수인데, 문자열의 for 루프에서 루프 변수는 각 문자를 참조한다. 그러니까 여기서 char이라는 변수명은 character를 나타내는 것이다.
변수명 뒤에는 in이라는 키워드가 있고 그 뒤에 반복하려는 문자열이 나온다. for 문도 if 문처럼 :으로 끝난다.
즉, '문자열이 주어지고, 규칙이 있는 루프를 실행하는데 그 루프는 진행될 때마다 문자열(secret_word) 안의 문자(char)를 참조한다. 참조한 문자는 Letter: 한칸 띄우고 문자 순서로 출력한다' 는 의미이다.
참고로, len 함수는 문자열을 받아 길이를 반환한다.
>>> len('olive')
5
for 루프 블록에는 하나 이상의 문장이 존재할 수 있다. 그러니까 예를 들면, for 안에 for가 들어가고 그 안에 if가 들어가는 것이 가능하다는 뜻이고 이걸 중첩(nested)이라고 한다.
중첩이란, 엄밀히 말하면 context가 중첩된다는 의미이다. 어떤 전제를 깔아 놓은 상태에서 특정한 상황이 덧붙여진다는 것으로... 사람의 말로 하자면, "지금 내 지갑에 3만원이 있으니까, 5000원짜리 커피를 마실 수도 있고 7000원짜리 디저트를 먹을 수도 있고, 15000원짜리 화장품을 살 수도 있어. 아니면 그 모든 걸 다 할 수도 있어."라는 말처럼 지갑에 3만원이 있다는 전제하에 나머지 상황들이 일어나는 것을 말한다. (3만원 밖에 없는데, 35000원을 쓰게 되면 당연히 오류가 발생하겠지?)
여기에서 중요한 것은 깔려 있는 context가 해결될 때까지 해지되지 않는다는 것이다.
여기에서 for를 outer context라고 하고 if를 inner context라고 한다. title('The Escape')의 문자를 참조하는 것을 반복하는데, 만약 문자가 대문자(isupper)라면 그 문자를 출력하라는 의미이다.
중첩은 시간의 순서를 가지고 있다. 다시 말해, outer context를 유지한 채 inner context를 순서대로 해결해야 하는 것이다.
문제를 하나 풀어보자.
이 문제를 풀 수 있겠는가? 안타깝게도... 복습을 하고 있는 지금 나는 이 문제가 이해가 안간다.
아무래도 다시 공부를 해야할 것 같다.
'Python 배우기' 카테고리의 다른 글
[외계어 배우기] 연습문제 (1) | 2024.02.24 |
---|---|
[외계어 배우기] 문제#5 Three Cups (0) | 2024.02.22 |
[외계어 배우기] Happy or Sad (0) | 2024.02.18 |
[외계어 배우기] An Honest Day's Work (0) | 2024.02.14 |
[외계어 배우기] 문제#4 Telemarketers (0) | 2024.02.13 |