28.3 연습문제: 단어 단위 N-gram 만들기

표준 입력으로 정수와 문자열이 각 줄에 입력됩니다. 다음 소스 코드를 완성하여 입력된 숫자에 해당하는 단어 단위 N-gram을 튜플로 출력하세요(리스트 표현식 사용). 만약 입력된 문자열의 단어 개수가 입력된 정수 미만이라면 'wrong'을 출력하세요.

practice_n_gram_word.py

n = int(input())
text = input()
words =            
 
if (             ):
    print('wrong')
else:
    n_gram =                                  
    for i in n_gram:
        print(i)

실행 결과

7 (입력)
Python is a programming language that lets you work quickly (입력)
('Python', 'is', 'a', 'programming', 'language', 'that', 'lets')
('is', 'a', 'programming', 'language', 'that', 'lets', 'you')
('a', 'programming', 'language', 'that', 'lets', 'you', 'work')
('programming', 'language', 'that', 'lets', 'you', 'work', 'quickly')

실행 결과

7 (입력)
Python is a programming language (입력)
wrong

정답

 text.split()
 len(words) < n
 zip(*[words[i:] for i in range(n)])

해설

먼저 input으로 입력된 값은 한 줄로 된 문자열이므로 split을 사용하여 공백을 기준으로 분리한 뒤 words에 저장해줍니다.

여기서는 N-gram의 N이 변수 n에 저장되므로 n을 활용하여 조건식을 작성합니다. 먼저 단어 개수가 입력된 숫자 미만이면 'wrong'을 출력하라고 했으므로 if 조건문에는 len(words) < n을 넣어줍니다.

N-gram은 리스트 표현식을 사용하고, 결과는 튜플로 출력하라고 했으므로 리스트 표현식으로 문자열 리스트를 만든 뒤 zip에 넣어주어야 합니다.

먼저 입력된 숫자에 해당하는 N-gram 문자열 리스트는 [words[i:] for i in range(n)]와 같이 forn만큼 반복하면서 words[i:]로 리스트를 만들어줍니다. 그리고 zip에 리스트의 각 요소를 콤마로 구분해서 넣을 수 있도록 리스트 앞에 *를 붙여서 리스트 언패킹을 해줍니다.