Page 26 -
P. 26

(1) 같은 문자가 여러 번 나오는 경우를 어떻게 처리할 것인가? (2) 타일에서 단어에 들어 있는 글
               자를 모두 찾은 경우를 어떻게 알 수 있을까?

               (1)을 해결하려면 올바른 단어에 포함된 타일을 없애도록 코드를 작성한다. 올바른 단어를 튜플에
               서 하나 가져올 때마다 tiles_left라는 변수를 사용한다. 처음 tiles_left에는 가지고 있는 모든
               타일이 들어 있다. 하지만 단어의 각 문자를 처리할 때마다 tiles_left를 사용해 남은 타일을 추

               적한다. 이렇게 하려면 단어에서 문자를 처리할 때 그 문자에 해당하는 타일이 있으면 tiles_left
               가 그 문자를 제외한 나머지 문자만 포함하도록 갱신해야 한다.

               (2)를 해결하기 위한 아이디어는 다음과 같다. 앞에서 봤듯이 단어의 각 문자를 가져와서 그 문자
               에 해당하는 타일을 찾으면 tiles_left에서 그 문자를 하나 제거한다. 따라서 올바른 단어의 길이
               와 tiles_left에서 제거한 타일의 개수가 일치하면 타일로 그 단어를 만들 수 있다는 걸 알 수 있
               다(문자에 해당하는 타일을 찾지 못하면 그 문자를 tiles_left에서 제거할 수 없으므로 단어 길이
               가 제거한 타일 개수보다 더 커진다). 제거한 타일 개수는 처음 가지고 있던 타일 개수에서 단어에

               대한 루프를 끝낸 후 tiles_left에 남은 타일의 개수를 뺀 값이다.

               코드 19-3의 코드를 보자. 코드 안에는 내포된 루프가 들어 있다. 바깥쪽 루프는 올바른 단어를
               처리하고, 안쪽 루프는 올바른 단어에 들어 있는 문자를 처리한다. 타일에 없는 문자를 발견하면
               내부 루프를 끝내고 다음 단어로 넘어간다. 타일에 문자가 있으면 단어에 있는 다음 문자를 처리
               한다. tiles_left는 처리 중인 문자에 해당하는 타일을 제외한 남은 타일들을 저장한다. 어떤 문

               자를 타일에서 찾을 때마다 그 위치를 가지고 문자열 슬라이스를 통해 그 문자를 제외한 나머지
               문자들로 이뤄진 문자열을 만들어 저장한다. 마지막 단계는 올바른 단어의 모든 문자를 타일에서
               찾아냈는지 검사하고, 모든 문자를 찾은 경우 찾은 단어 목록에 해당 단어를 추가한다.


                코드 19-3 스크래블:아트. 주어진 타일로 만들 수 있는 올바른 단어를 모두 찾는 부분
                 for word in all_valid_words:   올바른 단어들을 살펴본다
                     tiles_left = tiles   tiles_left는 타일 중복을 처리한다
                     for letter in word:   올바른 단어의 모든 문자를 처리한다
                         if letter not in tiles_left:
                                                   tiles_left 안에 문자가 없으면 루프를 중단한다
                             break
                         else:
                             index = tiles_left.find(letter)   tiles_left에서 문자 위치를 찾는다
                             tiles_left = tiles_left[:index]+tiles_left[index+1:]
                     if len(word) = = len(tiles)-len(tiles_left):   타일로 단어를 만들 수 있는지 검사한다
                         found_words = found_words + (word,)   found_words에 단어를 추가한다

                 print(found_words)                                찾은 문자를 없앤 새 tiles_left를 만든다


         238





     모던 파이썬 입문(본문)5차_최종.indd   238                                                           2019-09-26   오후 9:33:42
   21   22   23   24   25   26   27