[Algorithm] 회문 문자열 검사

myeonji·2022년 1월 19일
0

Algorithm

목록 보기
3/89

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

읽자마자 아스키코드가 떠올랐다.

<내 답안>

n = int(input())
for i in range(n):
    string = input()
    for a in range(0, len(string)):
        if string[a] == string[len(string)-(a+1)]:
            ans = 'YES'
        else:
            if ord(string[a]) > ord(string[len(string)-(a+1)]):
                if ord(string[a]) == ord(string[len(string)-(a+1)])+32:
                    ans = 'YES'
                else:
                    ans = 'NO'
                    break
            elif ord(string[a]) < ord(string[len(string)-(a+1)]):
                if ord(string[a])+32 == ord(string[len(string)-(a+1)]):
                    ans = 'YES'
                else:
                    ans = 'NO'
                    break
    print('#{} {}'.format(i+1, ans))

아스키코드 변환에서 문자->숫자는 ord, 숫자->문자는 chr이다.
A = 65, a = 97 이므로 비교할 때 대문자와 소문자의 차이인 32를 더하는 방식으로 풀었다.

<모범답안>

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

해설을 들어보니 입력받는 문자를 우선 대문자로 바꾸고 시작했다.
upper() 함수를 써서 대문자로 바꿀 수 있으니 간단한 것 같다.
그리고 for문 안에 범위를 size//2로 풀으셨는데 '그럼 정 가운데 문자는 뭐랑 비교하지?' 라고 순간 생각했지만.. 다시 생각해보니 정 가운데 문자는 비교할 필요가 없었다. (바보같ㄷㅏ..)
그리고 문자 비교할 때 앞에서부터는 j 이지만 뒤에서부터는 -1-j로 둘 수 있다.
왜냐하면 인덱스를 뒤에서부터 셀 때는 -1, -2, -3... 이런 식으로 표현되기 때문이다. 다 알고 있는 개념인데 응용을 못한다.. 내가 알고 있는 부분에서만 풀려고 하니까 어렵고 복잡하게 코드를 짜는 것 같다.

<참고할 답안>

n = int(input())
for i in range(n):
    s = input()
    s = s.upper()
    if s == s[::-1]:
        print('#%d YES' % (i + 1))
    else:
        print('#%d NO' % (i + 1))

이거는 직접 비교하는 코드를 구현한 것이 아니라 좋은 코드라고 할 수는 없지만, s[::-1] 이렇게 쓰는 방식이 신선해서 기억해둬야겠다. s[::-1]은 s 라는 문자열을 reverse 해주는 코드이다.

0개의 댓글