Algorism/Python

회문 문자열

aoaa 2022. 3. 10. 14:18

N개의 문자열 데이터를 입력받아 앞에서 읽을 때나 뒤에서 읽을 때나 같은 경우(회문 문자열) 이면 YES를 출력하고 회문 문자열이 아니면 NO를 출력하는 프로그램을 작성한다.

단 회문을 검사할 때 대소문자를 구분하지 않습니다.

▣ 입력설명 첫 줄에 정수 N(1<=N<=20)이 주어지고, 그 다음 줄부터 N개의 단어가 입력된다. 각 단어의 길이는 100을 넘지 않는다.

▣ 출력설명 각 줄에 해당 문자열의 결과를 YES 또는 NO로 출력한다.

▣ 입력예제 1 5 level moon abcba soon gooG

▣ 출력예제 1 #1 YES #2 NO #3 YES #4 NO #5 YES

import sys
sys.stdin = open("input.txt", 'r')
n=int(input())
for i in range(n):
    s=input()
    s=s.upper
    size=len(s)
    for j in range(size//2):
        if [j]!=s[-1-j]:
            print("#%d NO" %(i+1))
            break
    else:
        print("#%d YES" %(i+1))

s라는 문자열 변수를 만들어 준뒤, 대소문자를 구별하지 않으므로 s.upper로 대문자로 치환시킵니다. (level -> LEVEL)

size라는 변수를 문자열의 길이만큼 읽도록 만듭니다.

index 0 1 2 3 4
s L E V E L

처음 문자열의 길이를 2로나눈 몫만큼 반복문(j)를 돌립니다.

Level(5)를 2로 나눈 몫은 2가되기 때문에 반복문이 2번 도는 것이죠.

index -5 -4 -3 -2 -1
s L E V E L

이 때 문자열을 시작부터가 아닌 끝열부터 접근하면 index를 -1부터 시작하게되는데

첫 인덱스와 끝인덱스가 같지 않다면 NO를 출력하고 break하도록 설정해주었습니다.

예를 들면, [0]!=s[-1-0]라고 접근하게 되면 0번 인덱스인 L, -1번의 인덱스인 L이 같죠. 그러면 진행되지 않고,

else 문을 통해 YES를 출력하게 됩니다.

if s==s[::-1]:
    print("#%d YES" %(i+1))
            break
    else:
        print("#%d NO" %(i+1))

조금더 파이썬처럼 접근해보겠습니다.

문자열을 s[::-1]로 한다면(slicing) index값을 역으로 읽게되는데

이 때, 문자열과 역으로 만든 문자열이 같다면 YES를 출력하게됩니다.

 

파이썬적인 접근으로 쉽게 만들었지만, 코딩 테스트같은 경우는 1번과 같이 접근하는 방식을 이용하면 더 좋을것입니다.

'Algorism > Python' 카테고리의 다른 글

카드 역배치  (0) 2022.03.11
숫자열만 추출하기  (0) 2022.03.10
소수(에라토스테네스 체)  (0) 2022.03.08
자릿수의 합  (0) 2022.03.07
정다면체  (0) 2022.03.07