ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회문 판별과 N-gram 만들기
    Python/Grammar 2023. 3. 25. 20:55

    # 1. 회문 판별하기

    회문(palindrome)이란? 거꾸로 읽어도 제대로 읽은 것과 같은 단어나 문장을 말한다. 예를 들어 SOS, level, nurses run, rotator, 기러기, 토마토 등이 있다.

     

    1-1. 반복문으로 문자 검사하기

    0부터 문자열 길이의 절반만큼 반복하면서 왼쪽 문자, 왼쪽 문자와 대칭되는 위치의 오른쪽 문자를 비교해서 문자가 다르면 회문이 아니라고 판단한다.

    word = intput()
    
    is_palindrome = True
    for i in range(len(word) // 2):
        if word[i] != word[-i -1]:
            is_palindrome = False
            break
    
    print(is_palindrome)

     

     

    1-2. 시퀀스 뒤집기로 문자 검사하기

    슬라이스를 활용해 증가폭을 -1로 주면 입력한 문자열을 거꾸로 뒤집은 문자열로 만들 수 있고, 이를 원래 문자열과 비교하면 된다.

    word = input()
    
    is_palindrome = True
    if word != word[::-1]:
        is_palindrome = False
        
    print(is_palindrome)

     

    아래와 같이 작성하면 더 간단히 표현할 수 있다. 

    word = input()
    
    print(word == word[::-1])

     

     

    1-3. 리스트와 reversed 사용하기

    단어를 반복 가능한 객체화 하고 그 객체의 요소 순서를 반대로 뒤집는 reversed를 사용해 회문을 판단할 수도 있다. 

    word = input()
    
    print(list(word) == list(reversed(word)))

     

    1-4. 문자열의 join 메서드와 reversed 사용하기

    join은 구분자 문자열과 문자열 요소를 연결한다. 문자열 요소의 순서를 뒤집어 빈 문자열을 구분자로 연결하면 word를 거꾸로 만들 수도 잇다.

    word = input()
    
    print(word == ''.join(reversed(word)) # 그냥 word를 reversed 하면 reversed 객체가 나와서 word와 비교할 수 없다. 
    				      # ''.join 같은 처리를 해줘야 한다.

     

     

    # 2. N-gram 만들기

    N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법이다. Hello를 2-gram으로 추출하면 He, el, ll, lo가 된다.

     

    2-1. 반복문으로 N-gram 출력하기

    word = 'Hello'
    
    for i in range(len(word) -1):
        print(word[i], word[i + 1], sep='')
        
    # 실행결과
    He
    el
    ll
    lo

     

    3-gram으로 추출하면 Hel, ell, llo가 된다.

    word = 'Hello'
    
    for i in range(len(word) - 2):
        print(word[i], word[i+1], word[i+2], sep='')

     

    단어가 아닌 문장은 split으로 구분하면 풀 수 있다.

    line = 'I want to be a great person'
    words = line.split()
    for i in range(len(words) - 1):
      print(words[i], words[i+1], sep=' ')

     

     

    2-2. zip으로 2-gram 만들기

    zip함수는 반복 가능한 객체의 각 요소를 튜플로 묶어준다.

    word = 'Python'
    
    two_gram = zip(word, word[1:])
    for i in two_gram:
        print(i[0], i[1], sep='')

     

     

    2-3. zip과 리스트 표현식으로 N-gram 만들기

    리스트 표현식을 사용하면 zip에 [1:], [2:]와 같이 매번 슬라이싱을 직접 입력하지 않고도 표현할 수 있다.

    word = 'hello'
    three_gram = list(zip(*[word[i:] for i in range(3)]))
    for i in three_gram:
      print(i[0], i[1], i[2], sep='')

     

    예제 1. 단어 단위 N-gram 만들기 (본문 28.3 연습문제)

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

    n = int(input())
    text = input()
    words = text.split()
    
    if len(words) < n:
      print('wrong')
    else:
      n_gram = list(zip(*[words[i:n+i] for i in range(n)]))
      for i in n_gram:
        print(i)

     

    예제 2. 파일에서 회문인 단어 출력하기 (본문 28.4 심사문제)

     

    댓글

Designed by Tistory.