📌문제
🎖️난이도
✔️풀이
n = int(input())
def isPalindrome(string):
if string == string[::-1]:
return True
else:
return False
def isPseudo(string):
for i in range(len(string)//2):
if string[i] != string[len(string)-i-1]:
str1, str2 = string.copy(), string.copy() # **깊은복사**
str1.pop(i)
str2.pop(len(string)-i-1)
if isPalindrome(str1) or isPalindrome(str2):
return True
else:
return False
for _ in range(n):
string = list(input())
if isPalindrome(string):
print(0)
elif isPseudo(string):
print(1)
else:
print(2)
🧠노트
회문인지 아닌지 판별하는 건(isPalindrome) 그냥 반대로 뒤집어서 같은지 확인하면 되고,
유사 회문인지 아닌지 판별하는 부분은(isPseudo),
양쪽에서 투 포인터로 동시에 한 칸씩 움직이면서 같은지 다른지 체크하는데
만약 다르면 한 쪽씩 제거해내서(pop) 같아지는지 아닌지(isPalindrome)를 딱 한 번만 다시 체크해주면 된다.
이때,
원본 문자열(string)을 복사할 때
대입연산자(=)로 하면 얕은 복사가 되어서 원본 문자열에 영향을 끼치므로,
복사함수(copy)로 깊은 복사를 해야 하는 것이 포인트!
🔍참고
[ 반복문 내에서 반복 대상의 길이가 바뀔 때 ]
for문의 range 내의 len()은 반복 대상의 길이의 초기값으로 유지됨!
string = list('string')
for i in range(len(string)): # range 내의 len은 초기값으로 유지
print(''.join(string), len(string))
string.pop()
'''
string 6
strin 5
stri 4
str 3
st 2
s 1
'''
'[ 알고리즘 ] > String' 카테고리의 다른 글
[백준] 20437. 문자열 게임 2 (0) | 2022.08.10 |
---|---|
[백준] 17413. 단어 뒤집기 2 (0) | 2022.08.06 |
[백준] 10798. 세로읽기 (0) | 2022.08.06 |