목차
👀, 🤷♀️ , 📜
이 아이콘들을 누르시면 코드, 개념 부가 설명을 보실 수 있습니다:)
팰린드롬수
난이도| Bronze
백준으로 문제보기
문제
어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. ‘radar’, ‘sees’는 팰린드롬이다.
수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.
[입력]
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.
[출력]
각 줄마다 주어진 수가 팰린드롬수면 ‘yes’, 아니면 ‘no’를 출력한다.
Example: 입력
121
1231
12421
0
출력
yes
no
yes
‘팰린드롬’ 이란?
앞뒤가 똑같은 단어나 문장으로, 뒤집어도 같은 말이 되는 단어 또는 문장이다.
우리 말로는 ‘회문’이라고 부른다.
예를 들어,
race a car를 보자. 이 문장에 띄어쓰기를 없애면 raceacar이다.
이 문장은 뒤집어도 race a car이다.
이러한 팰린드롬의 특징을 이용하면 많은 문제들을 만들어 낼 수 있기 때문에 코딩 테스트에 자주 출제되기도 한다.
풀이과정
이 문제는 크게 두가지 과정을 거친다.
1️⃣ 전처리: 모두 소문자로 바꾸고 영문자와 숫자만 골라내기
2️⃣ 골라낸 것들의 팰린드롬 판별하기
3️⃣ 만든 팰린드롬을 문제에 적용하기
1. 전처리
먼저 영문자와 숫자만 골라낸 후,
골라낸 것들을 소문자로 바꿔야 한다.
영문자와 숫자와 골라내는 매서드는 바꿀 것.isalnum()
이다.
이건 is+alphabet+number라고 기억해두면 좋다.
생각보다 많이 쓰이니까 기억해두자.
그리고 골라낸 것들을 소문자로 바꾸는 매서드는 바꿀 것.lower()
이다.
즉 이를 이용하여 코드를 짜보면
def isPalindrome(self, s: str) -> bool:
str = [] # 소문자인 알파벳과 숫자만 넣을 곳
for i in s: # 하나하나 둘러보자
if i.isalnum(): # 숫자와 골라내는 매서드
str.append(i.lower()) # 소문자로 바꾸는 매서드
📜 과정 자세히 보기
2. 팰린드롬 판별
먼저 넣은 str을 한번씩 봐야된다.
여기에 앞 뒤를 하나씩 꺼내서 보는 것 이다.
앞에 것을 pop(0)
을 통해 꺼내고 뒤의 것을 pop()
을 통해 꺼낸다.
그리고 이 두개를 비교한다.
그래서 계속 같으면 True 다르면 False를 return하면 된다.
while len(str) > 1:
if str.pop(0) != str.pop():
return False
return True
📜 과정 자세히 보기
PLUS) 데크 자료형을 이용한 최적화
전체 과정을 위와 똑같다
class Solution:
def isPalindrome(self, s: str) -> bool:
str: Deque = collections.deque() # 데크선언
for i in s:
if i.isalnum():
str.append(i.lower())
while len(str) > 1:
if str.popleft() != str.pop():
return False
return True
3. 문제 적용
위에서 만든 팰린드롬 함수를 문제에 맞게 적용해보면 된다
while True:
instr = input()
if instr == '0':
break
if isPalindrome(instr)==True:
print("yes")
else:
print("no")
전체 코드
위를 구현한 전체 코드는 다음과 같다
데크를 쓰지 않았을 때
def pal(instr):
strs = []
for char in instr:
if char.isalnum(): # 알파벳, 숫자 골라내기
strs.append(char.lower())
# 이제 각 줄의 strs가 만들어짐
else:
while len(strs)>1:
if strs.pop(0) != strs.pop():
return False
return True
while True:
instr = input()
if instr == '0':
break
if pal(instr)==True:
print("yes")
else:
print("no")
데크를 썼을 때
from collections import deque
def pal(instr):
strs = deque()
for char in instr:
if char.isalnum(): # 알파벳, 숫자 골라내기
strs.append(char.lower())
# 이제 각 줄의 strs가 만들어짐
else:
while len(strs)>1:
if strs.popleft() != strs.pop():
return False
return True
while True:
instr = input()
if instr == '0':
break
if pal(instr)==True:
print("yes")
else:
print("no")