-
회문 판별과 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 심사문제)
'Python > Grammar' 카테고리의 다른 글
[Python 2차원 리스트] 리스트 반복과 리스트 컴프리헨션의 차이 (1) 2024.03.12 15. 제너레이터 사용하기 (0) 2023.03.11 12. elif를 사용하여 여러 방향으로 분기하기 (0) 2023.03.10 11. else를 사용하여 두 방향으로 분기하기 (0) 2023.03.09 13. 반복문 제어하기 (0) 2022.12.08