<aside> 💬

lv1, 문자열 처리, N-gram

문자열 N-gram 생성

문제 설명

주어진 문자열과 정수 N에 대해, 문자열의 N-gram을 생성하는 코드를 작성해주세요. N-gram은 주어진 문자열에서 N개의 연속된 요소를 순차적으로 추출한 것입니다. 예를 들어, 문자열 "hello"에 대한 2-gram은 ['he', 'el', 'll', 'lo']입니다. 만약 문자열의 길이가 N보다 작다면, 빈 리스트를 반환합니다.


제한 사항


입출력 예

입력 (문자열, N) 출력 (N-gram 리스트)
("hello", 2) ['he', 'el', 'll', 'lo']
("world", 3) ['wor', 'orl', 'rld']
("python", 5) ['pytho', 'ython']

입출력 설명

주어진 문자열에서 N개의 연속된 문자를 순차적으로 추출하여 리스트로 반환합니다. 문자열 길이가 N보다 작은 경우 빈 리스트를 반환합니다. 예를 들어, "python" 문자열에 대한 5-gram은 연속된 다섯 글자씩 추출한 결과이므로 ['pytho', 'ython']이 됩니다. 문자열의 길이가 N보다 작은 경우, 예를 들어 "hi" 문자열에 대한 3-gram은 불가능하므로, 이 경우에는 빈 리스트를 반환합니다. 주어진 문자열에서 N개의 연속된 문자를 순차적으로 추출하여 리스트로 반환합니다. 문자열 길이가 N보다 작은 경우 빈 리스트를 반환합니다.

</aside>

😺 풀이 1. 조건 검사, 슬라이싱

def solution(data): **#1 함수 정의**
    text, n = data **#2 데이터 분리**
    if len(text) < n: **#3 조건 검사**
        return [] **#4 빈 리스트 반환**
    return [text[i : i + n] for i in range(len(text) - n + 1)] **#5 N-gram 리스트 반환**

단계별 풀이 전략

  1. 함수 정의

    코드의 첫 부분에서 solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. dataN 개의 연속된 문자열이 순차적으로 추출된 리스트를 구하기 위해 주어지는 문자열과 정수 N입니다.

  2. 데이터 분리

    data에서 문자열과 정수 Ntext, n으로 언패킹합니다.

  3. 조건 검사

    if len(text) < n:을 통해 문자열 text의 길이 len(text)가 정수 n보다 작다는 조건을 검사합니다. 문자열 text가 해당 조건을 만족한다면, 조건문 아래 코드를 실행합니다.

  4. 빈 리스트 반환

    만일 len(text)이 정수 n보다 작다면, 문자열 text에서 n 개의 연속된 문자를 추출할 수 없습니다. 그러므로 이럴 때, 문제에서 요구한 대로 빈 리스트를 반환합니다.

  5. N-gram 리스트 반환

    1. len(text)n 이상이면, text에서 n 개의 연속된 문자로 추출하도록 슬라이싱하여 윈도우를 구할 수 있고 최초 슬라이싱을 포함하여 1번 이상 슬라이딩을 진행할 수 있습니다. 그렇다면 연속된 n 개의 문자를 순차적으로 슬라이딩하여 리스트로 반환해야 합니다.
    2. 여기서 최초 슬라이싱을 포함한 가능한 슬라이딩 횟수는 len(text) - n + 1입니다. 그리고 for i in range(len(text) - n + 1)와 같이 forrange를 통해 슬라이딩 횟수만큼 슬라이딩을 진행합니다.
    3. 이때, i는 윈도우를 구하기 위해 슬라이싱의 인덱스 시작점으로 사용됩니다. 그럼 슬라이딩할 때마다 text[i : i + n]를 통해 문자열 text를 슬라이싱하여 n 개의 연속된 문자를 구하고 리스트에 추가합니다.
    4. 이러한 과정을 리스트 컴프리헨션을 통해 [text[i : i + n] for i in range(len(text) - n + 1)]로 연산하고 그 결과인 N-gram 리스트를 반환합니다.

알아둬야 할 개념

N-gram

풀이 2. 슬라이싱, 리스트 컴프리헨션

def solution(data): **#1 함수 정의**
    word, n = data[0], data[1] **# 2 데이터 분리**
    return [word[i:i+n] for i in range(len(word)-n+1)] **#3 N-gram 리스트 반환**

단계별 풀이 전략

  1. 함수 정의

    코드의 첫 부분에서 solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. dataN 개의 연속된 문자열이 순차적으로 추출된 리스트를 구하기 위해 주어지는 문자열과 정수 N입니다.

  2. 데이터 분리

    data에서 문자열 data[0]과 정수 N data[1]word, n으로 언패킹합니다.

  3. N-gram 리스트 반환

    1. 가장 먼저 오는 n 개의 연속된 문자열은 word[0:0+n]을 통해 구할 수 있습니다. 그리고 연속된 문자열을 추출할 수 있는 조건은 len(word) > n이므로 마지막으로 오는 n 개의 연속된 문자열은 word[len(word)-n:len(word)]으로 구할 수 있습니다.
    2. 이처럼 word[0:0+n]을 시작으로 마지막에 word[len(word)-n:len(word)]을 추출하기 위해, 문자열 word의 슬라이싱의 인덱스 시작점을 0에서 len(word)-n까지 순차적으로 높일 수 있는 forword[i:i+n] for i in range(len(word)-n+1)을 만들 수 있습니다.
    3. 여기에서 리스트를 씌워주어 for 문 아래 코드 word[i:i+n]의 결과를 리스트에 바로 추가합니다. 이렇게 만들어진 N-gram 리스트를 return [word[i:i+n] for i in range(len(word)-n+1)]을 통해 반환합니다.