본문 바로가기

Algorithm problems, coding test/백준

[백준][1259][B1] 펠린드롬수

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

출력

각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.


구현은 간단하지만, 파이썬의 숙련도에 따라 코드의 효율성이 달라진다.

그래서 이번에는 다른 사람들의 코드를 보면서 다음과 같은 중요한 사항을 논하고자 한다.

"구현은 가능하나, 효율적으로 구현하지 못하겠다면.. 다른 사람의 코드를 보는 것이 좋다."

#출처 : https://hooongs.tistory.com/232
# 1259번 팰린드롬수

# main
while True:
    n = input()

    if n == '0':
        break

    if n == n[::-1]:
        print('yes')
    else:
        print('no')
#출처 : 나
import sys

while True:
    n = int(sys.stdin.readline())
    if n == 0:
        break
    n = str(n)
    answer = True
    for i in range(len(n)):
        if n[i] != n[-1-i]:
            answer = False
            break
    if answer == False:
        print('no')
    else:
        print('yes')
#출처 : https://www.acmicpc.net/source/43655014
while True:
    N=input()
    if N=="0":
        break
    L=list(" ".join(N).split())
    L.reverse()
    if N=="".join(L):
        print("yes")
    else:
        print("no")
#출처 : https://www.acmicpc.net/source/43651877
import math

while True:
    word = input()
    match=0
    if word=='0':
        break
    count=math.ceil(len(word)/2)
    
    for i in range(count):
        if(word[i]==word[-(i+1)]):
            match+=1
    
    if(match==count):
        print("yes")
    else:
        print("no")

이 4개의 코드를 보면, 어떤 생각이 드는가?

 

물론, 사람마다 프로그램을 짜는 방식이 다 다르고, 디자인 패턴도 전부 다 다를 수 있다.

그러나, 이런 간단한 문제를 가지고 굳이 비효율적인 방법을 고수할 필요는 없지 않은가?


배운점

n[::-1] // 문자열, 리스트를 반대로 돌려준다.