<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를 받습니다. data는 N 개의 연속된 문자열이 순차적으로 추출된 리스트를 구하기 위해 주어지는 문자열과 정수 N입니다.

  2. 데이터 분리

    data에서 문자열과 정수 N을 text, 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)와 같이 for와 range를 통해 슬라이딩 횟수만큼 슬라이딩을 진행합니다.
    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를 받습니다. data는 N 개의 연속된 문자열이 순차적으로 추출된 리스트를 구하기 위해 주어지는 문자열과 정수 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까지 순차적으로 높일 수 있는 for 문 word[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)]을 통해 반환합니다.