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번과 같이 접근하는 방식을 이용하면 더 좋을것입니다.