BOJ 1259. 팰린드롬 수 (Python)

2021. 2. 10. 01:53Problem Solving/BOJ

BOJ 1259. 팰린드롬 수

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

 

1259번: 팰린드롬수

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

www.acmicpc.net

Logic

팰린드롬이란 앞 뒤가 같은 것이다. 토마토, 기러기 같은.

앞에서부터 뽑고, 뒤에서부터 뽑은것이 끝까지 일치한다면 이것은 팰린드롬 수 일것이다.

 

 

한번이라도 일치하지 않는다면 그것은 팰린드롬 수가 아니다.

 

0이 나올때까지 While문을 돌며 input한것을 deque에 저장한다.

 

이때 그냥 list를 사용하지 않고 덱을 쓰는 이유는, 파이썬의 리스트에서 .pop(0)을하면 시간복잡도가 O(n)이 되기 때문이다. 따라서 앞, 뒤에서 pop할수있는 deque를 사용하면 실행 시간을 줄일 수 있다.

case = sys.stdin.readline().strip()

if case == "0":
    break

deq = collections.deque(list(map(int,case)))

 

덱에 input한것을 담고 나서 다시 while문을 돈다.


len(deq)이 1이 될 때까지 break하지 않으면 이것은 길이가 홀수인 팰린드롬수이니 "yes"를 프린트하고 while문을 종료한다.

if len(deq) == 1:
    print("yes")
    break

 

한번이라도 일치하지 않으면 "no"를 출력하고, len(deq)이 0이면서 left와 right가 일치하면 이것은 길이가 짝수인 팰린드롬수이기 때문에 "yes"를 프린트하고 while문을 종료한다.

left = deq.popleft()
right = deq.pop()

if left != right:
    print("no")
    break

if left == right and len(deq) == 0:
    print("yes")
    break

 

Solution 1

import sys
import collections

while True:
    case = sys.stdin.readline().strip()

    if case == "0":
        break

    deq = collections.deque(list(map(int,case)))

    while True:
        if len(deq) == 1:
            print("yes")
            break

        left = deq.popleft()
        right = deq.pop()

        if left != right:
            print("no")
            break

        if left == right and len(deq) == 0:
            print("yes")
            break

여기서부턴 좀 편법인데,,,

Solution 2

import sys

while True:
    case = sys.stdin.readline().strip()

    if case == "0":
        break
    
    case = list(case)

    if case == list(reversed(case)):
        print("yes")
    else:
        print("no")

파이썬 내장함수인 reverse()나 reversed()를 사용해서 풀 수 있다.

 

Solution 3

import sys

while True:
    case = sys.stdin.readline().strip()

    if case == "0":
        break

    if case == case[::-1]:
        print("yes")
    else:
        print("no")

Python의 슬라이싱을 이용해서 풀 수도 있다.

 

 

하지만 이게 코딩테스트나 면접에서 나온다고 하면 2,3처럼 풀면 안될거같다 .. ㅎㅎ 고로 1처럼 푸는 방법을 알아야 할 것이다.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

BOJ 11050. 이항계수 1 (Python)  (0) 2021.02.10
BOJ 2798. 블랙잭 (Python)  (0) 2021.02.10
BOJ 10250. ACM 호텔 (Python)  (0) 2021.02.10
BOJ 1085. 직사각형에서 탈출 (Python)  (0) 2021.02.09
BOJ 10818. 숫자의 합(Python)  (0) 2021.02.07