[BOJ] 17609 회문

이강혁·2025년 2월 19일
0

백준

목록 보기
59/60

https://www.acmicpc.net/problem/17609

문장이 그냥 회문이면 0, 글자 하나만 뺐을 때 회문이면 1을, 둘 다 아니면 2를 출력하는 문제이다.
처음에는 한쪽에서부터 올라가면서 절반쯤 도달했을 때 문장 뒤집어서 비교할까 싶다가 하단의 알고리즘 분류에 "투 포인터"라고 되어 있어서 투 포인터로 접근했다.

Python

import sys

input = sys.stdin.readline

n = int(input())

sen = [input().strip() for _ in range(n)]

for s in sen:
  l = len(s)
  start = 0
  end = l - 1
  
  counta = 0
  while start <= end:
    if counta > 1:
      break
    
    if s[start] == s[end]:
      start += 1
      end -= 1
    elif start+1 <= end and s[start+1] == s[end]:
      start += 1
      counta += 1
    elif start <= end - 1 and s[start] == s[end - 1]:
      end -= 1
      counta += 1
    else:
      counta = 2
      
  start = 0
  end = l - 1
  countb = 0
  while start <= end:
    if countb > 1:
      break
    if s[start] == s[end]:
      start += 1
      end -= 1
    elif start <= end - 1 and s[start] == s[end - 1]:
      end -= 1
      countb += 1
    elif start+1 <= end and s[start+1] == s[end]:
      start += 1
      countb += 1
    else:
      countb = 2
      
    
  
  if counta == countb == 2:
    print(2)
  elif counta * countb == 2 or counta * countb == 1:
    print(1)
  else:
    print(0)

문장 양 끝에서부터 중앙으로 오면서 만약에 둘이 다르다면, 서로 한 칸 앞과 또 비교하면서 한 칸 앞이 같다면 count를 추가하고, 각자의 한 칸 앞도 다르다면 2로 처리했다.

매 반복마다 count가 2 이상이 되면 멈추도록 했다.

처음에 실패했는데, start+1과 end를 먼저 비교했기 때문이었다.

baaba

같은 경우 baab로 유사회문이 되는데, start+1을 먼저 비교해서 aaba로 인식 되는 문제가 있었다.

그래서 start+1먼저일 때 한 번, end-1먼저 일 때 한 번 이렇게 두 번 반복문을 실행했다.

count가 둘 다 2라면 2를, 둘 중 하나 이상이 1이라면 1을, 그것도 아니면 0을 출력했다.

profile
사용자불량

0개의 댓글

관련 채용 정보