[구현] (3-1) 회문 문자열 검사: for else문 / reverse ([::-1])

2024. 6. 17. 22:34개발의 흔적/코딩테스트

문제:  회문 문자열 검사

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

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

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

입력예제

5
level
moon

abcba

soon

gooG

출력예제
#1 YES
#2 NO
#3 YES

#4 NO

#5 YES

 

1. 예제의 5번째 'gooG'을 보면 회문으로 처리하므로, 각 선택쌍끼리 비교하기 전에 모두 소문자 or 대문자로 바꾸어야한다.

 

2. 출력시 몇번째 단어인지도 출력해야하므로 각 단어마다 for문을 돌 떄, enumerate를 사용하도록 하자.

 

3. python에서는 String도 iteration으로 처리 할 수 있다. 

    word[ i - 1] == word [ -1] 을 이용하자

 

이러한 아이디어로 처음 작성한 코드:

 

import sys
input = sys.stdin.readline

N = int(input())
word_list = [input().strip() for _ in range(N)]

for index ,word in enumerate(word_list):
    word = word.lower()
    flag = True
    for i in range(len(word)//2):
        if word[i] != word[-(i+1)]:
            flag = False
            break
    # print(word)
    print (f"#{index+1} YES") if flag else print(f"#{index+1} NO")

 

flag를 이용했다. True로 초기화하고, 만약 한 쌍이라도 같지 않다면, False로 바꾼다.

 

그러나 최근에 for else문에 대해 알게 되었으므로 이를 이용해 코드를 조금 바꾸어보았다.

 

for else문 : for문이 끝까지 실행되었다면 else로 빠진다

for i in range(10):
    if 궁시렁궁시렁
        print("for문이 if에 걸려서 break됨!")
        break
else:
    print("for문이 끝까지 실행됨!!")

 

이러한 용도이다.

 

그래서 이를 통해 바꾼 최종코드:

 

import sys
input = sys.stdin.readline

N = int(input())
word_list = [input().strip() for _ in range(N)]

for index ,word in enumerate(word_list):
    word = word.lower()
    for i in range(len(word)//2):
        if word[i] != word[-(i+1)]:
            print(f"#{index + 1} NO")
            break
    else:
        print(f"#{index + 1} YES")

 

처음 for else를 접했을때 들었던 내 생각은, '이를 이용하면 기존에 flag를 사용해야 되었던 코드들을 단축 할 수 있겠다' 였는데 지금이 적절한 예시가 아닌가 싶다.

 

++ 추가

 

import sys
input = sys.stdin.readline

N = int(input())
word_list = [input().strip() for _ in range(N)]

for index ,word in enumerate(word_list):
    word = word.lower()
    if word == word[::-1]:
        print(f"#{index + 1} YES")
    else:
        print(f"#{index + 1} NO")