[BOJ][๐ŸŸก5][๋ฐฑ์ค€#17609] ํšŒ๋ฌธ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #17609


๋ฌธ์ œ

ํšŒ๋ฌธ(ๅ›žๆ–‡) ๋˜๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ(palindrome)์€ ์•ž ๋’ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ณผ ๋•Œ ๊ฐ™์€ ์ˆœ์„œ์˜ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€˜abbaโ€™ โ€˜kayakโ€™, โ€˜reviverโ€™, โ€˜madamโ€™์€ ๋ชจ๋‘ ํšŒ๋ฌธ์ด๋‹ค. ๋งŒ์ผ ๊ทธ ์ž์ฒด๋Š” ํšŒ๋ฌธ์ด ์•„๋‹ˆ์ง€๋งŒ ํ•œ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜์—ฌ ํšŒ๋ฌธ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฌธ์ž์—ด์„ โ€œ์œ ์‚ฌํšŒ๋ฌธโ€(pseudo palindrome)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€˜summuusโ€™๋Š” 5๋ฒˆ์งธ๋‚˜ ํ˜น์€ 6๋ฒˆ์งธ ๋ฌธ์ž โ€˜uโ€™๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ โ€˜summusโ€™์ธ ํšŒ๋ฌธ์ด ๋˜๋ฏ€๋กœ ์œ ์‚ฌํšŒ๋ฌธ์ด๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์ œ์‹œ๋œ ๋ฌธ์ž์—ด์„ ๋ถ„์„ํ•˜์—ฌ ๊ทธ๊ฒƒ์ด ๊ทธ ์ž์ฒด๋กœ ํšŒ๋ฌธ์ธ์ง€, ๋˜๋Š” ํ•œ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํšŒ๋ฌธ์ด ๋˜๋Š” โ€œ์œ ์‚ฌํšŒ๋ฌธโ€์ธ์ง€, ์•„๋‹ˆ๋ฉด ํšŒ๋ฌธ์ด๋‚˜ ์œ ์‚ฌํšŒ๋ฌธ๋„ ์•„๋‹Œ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์ธ์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์ผ ๋ฌธ์ž์—ด ๊ทธ ์ž์ฒด๋กœ ํšŒ๋ฌธ์ด๋ฉด 0, ์œ ์‚ฌํšŒ๋ฌธ์ด๋ฉด 1, ๊ทธ ์™ธ๋Š” 2๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.ย 


์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T(1 โ‰ค T โ‰ค 30)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ T๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 3 ์ด์ƒ 100,000 ์ดํ•˜์ด๊ณ , ์˜๋ฌธ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.


์ถœ๋ ฅ

๊ฐ ๋ฌธ์ž์—ด์ด ํšŒ๋ฌธ์ธ์ง€, ์œ ์‚ฌ ํšŒ๋ฌธ์ธ์ง€, ๋‘˜ ๋ชจ๋‘ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ํšŒ๋ฌธ์ด๋ฉด 0, ์œ ์‚ฌ ํšŒ๋ฌธ์ด๋ฉด 1, ๋‘˜ ๋ชจ๋‘ ์•„๋‹ˆ๋ฉด 2๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

7
abba
summuus
xabba
xabbay
comcom
comwwmoc
comwwtmoc


์ถœ๋ ฅ

0
1
1
2
2
0
1


My Sol

import sys
input = sys.stdin.readline
from collections import deque
from copy import deepcopy

def check():
    txt = deque(input().rstrip())
    tl = len(txt)
    txt, tl = check2(txt, tl)

    if tl < 2: return 0

    txt_a = deepcopy(txt)
    txt_a.pop()
    txt1, tl1 = check2(txt_a, tl-1)
    if tl1 < 2: return 1

    txt_b = deepcopy(txt)
    txt_b.popleft()

    txt2, tl2 = check2(txt_b, tl-1)
    return 2 if tl2 > 1 else 1


def check2(txt, tl):
    while tl >= 2:
        if txt[0] == txt[-1]:
            txt.pop()
            txt.popleft()
            tl -= 2
            continue
        break
    return txt, tl

T = int(input().rstrip())
for _ in range(T):
    print(check())

deque๋ฅผ ์ด์šฉํ•ด ์–‘ ๋์˜ ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™๋‹ค๋ฉด ํ•˜๋‚˜์”ฉ ๋นผ์ฃผ๋ฉฐ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ํ•œ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์–‘์ชฝ์„ ์ œ๊ฑฐํ•˜๋‹ค๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด ๊ทธ ๋•Œ๊นŒ์ง€์˜ deque์™€ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ check2๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ดˆ ์ž…๋ ฅ์— ๋Œ€ํ•œ deque๋ฅผ check2์— ๋„ฃ์œผ๋ฉด ํ•œ ๋ฒˆ์˜ ํšŒ๋ฌธ ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ด๋ผ๋ฉด ๊ทธ ์ž์ฒด๋กœ ํšŒ๋ฌธ์ด ์•„๋‹Œ ์ƒํ™ฉ์ด๋‹ค.

๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น deque์— ๋Œ€ํ•ด ์•ž์˜ ์•ŒํŒŒ๋ฒณ์„ ๋บ€ ๊ฒฝ์šฐ์™€ ๋’ค์˜ ์•ŒํŒŒ๋ฒณ์„ ๋บ€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด check2๋ฅผ ๋‹ค์‹œ ๋Œ๋ ค ํ™•์ธํ•˜๋ฉด ๋˜๊ฒ ๋Š”๋ฐ, ํ•œ ๊ฒฝ์šฐ๋ผ๋„ ํšŒ๋ฌธ์ธ ๊ฒฝ์šฐ์—๋Š” 1, ์•„๋‹ˆ๋ผ๋ฉด 2๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ๊ณ„์† ํ‹€๋ ค์„œ ํž˜๋“ค๊ฒŒ ํ’€์–ด๋ƒˆ๋Š”๋ฐ, ์•Œ๊ณ ๋ณด๋‹ˆ ํ•œ ๋ฒˆ ํšŒ๋ฌธ ์ฒดํฌ๋ฅผ ๋งˆ์นœ txt deque๋ฅผ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ check2๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ txt์˜ ์•ž ๋’ค ๋ฌธ์ž๋ฅผ ๋นผ๋‚ด๊ณ  append ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ์•Œ๊ณ ๋ณด๋‹ˆ ์–•์€๋ณต์‚ฌ๊ฐ€ ๋˜์–ด์„œ ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์˜ ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ด์ „ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์˜ ์ฒดํฌ๊นŒ์ง€ ๋งˆ์นœ deque๊ฐ€ ๋“ค์–ด๊ฐ”๋˜ ๊ฒƒ์ด์—ˆ๋‹ค. ์ด๋ฅผ ํŒŒ์•…ํ•˜๊ณ  deepcopy๋กœ ๋ณ€๊ฒฝํ•˜์ž ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

from sys import stdin
input = stdin.readline

def is_palindrome(string):
  p1 = 0
  p2 = len(string) - 1

  while p1 < p2:
    if string[p1] == string[p2]:
      p1 += 1
      p2 -= 1
    else:
      tmp1 = string[:p1] + string[p1 + 1:]
      tmp2 = string[:p2] + string[p2 + 1:]
      
      if tmp1[:] == tmp1[::-1] or tmp2[:] == tmp2[::-1]:
        return 1        
      else:
        return 2
  return 0


T = int(input())

for _ in range(T):
  string = input().strip()
  print(is_palindrome(string))

์—ฐ์‚ฐ์‹œ๊ฐ„์ด ์งง์€ ํ’€์ด๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ๋ถ„์„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ด ๋ถ„์€ index๋ฅผ ์ด์šฉํ•œ slicing์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ด์…จ๋‹ค. ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋•Œ๋ฌธ์— ๋˜๋„๋ก ์Šฌ๋ผ์ด์‹ฑ์„ ์ง€์–‘ํ•˜๋Š” ํŽธ์ธ๋ฐ, ์–ด์ฐจํ”ผ ๋‚ด๊ฐ€ ํ•œ ๋ฐฉ์‹์ด๋‚˜ ์ด ๋ถ„ ๋ฐฉ์‹์ด๋‚˜ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ํฌ๊ฒŒ ๋‹ค๋ฆ„์ด ์—†๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

์ฒ˜์Œ์œผ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ˆœ๊ฐ„๊นŒ์ง€ ์–‘์ชฝ์˜ ์ธ๋ฑ์Šค๋ฅผ ์กฐ์ •ํ•˜๋ฉฐ ์ขํ˜€์˜ค๋‹ค๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ˆœ๊ฐ„์— ์ธ๋ฑ์Šค์˜ ์กฐ์ •๊ณผ ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅํ–ˆ๋‹ค. ๋˜‘๋˜‘ํ•œ ๋ฐฉ์‹์ด๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ