본문 바로가기

알고리즘/백준

[ Python ] 17609번 : 회문

728x90
반응형

코딩테스트 해설

백준 17609번: 회문

문제 유형 : 문자열, 투포인터

작성 코드

import sys

N = int(sys.stdin.readline())


def is_check(s, left, right):
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True


for _ in range(N):
    s = sys.stdin.readline().strip()
    left, right = 0, len(s) - 1
    result = 0
    while left < right:
        if s[left] != s[right]:
            if (result := 1 if is_check(s, left + 1, right) or is_check(s, left, right - 1) else 2) != 0:
                break
        left += 1
        right -= 1
    print(result)

접근 방식

  • s[left] != s[right]가 차이가 난다면 무조건 최소 1개의 문제는 존재하는 겁니다 따라서, 체크를 하더라도 1, 2 밖에 나올 수 없습니다.
  • 만약 모든 조건이 잘 맞다면 result를 초기값으로 두고 그대로 print만 하게 된다면 result 하게 됩니다.
  • is_check를 통해 left + 1 값과 right -1 된 s(문자열)을 체크하도록 합니다
  • left 또는 right의 값이 변하였어도 이후에도 같지 않은 값이 있다면, False를 반환 합니다.
  • 추가로 둘다 False 일 경우, 2개 이상의 문제가 있다는 것이기에 := 대입표현식을 이용해 처리했습니다.

개선 사항

  • 간단하게 생각하면 간단하지만 어려우면 어려운 문제 같습니다.
  • 결국 좌우 반전으로 체크 하는 방법도 있는걸 알고 슬펐지만, 시간 복잡도와 공간 복잡도, 메모리 사용량에서 우위를 가져 다행입니다.

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[ Python ] 15656번 : N과 M (7)  (0) 2024.08.20
[ Python ] 15654번 : N과 M (5)  (0) 2024.08.14
[ Python ] 2230번: 수 고르기  (0) 2024.08.08
[ Python ] 1806번: 부분합  (0) 2024.08.07
[ Python ] 11728번: 배열 합치기  (0) 2024.08.07