[BOJ] 1747: 소수&팰린드롬

이슬비·2023년 2월 13일
0

Algorithm

목록 보기
80/110
post-thumbnail

끼얏호 한 번 틀리고 오답 후 바로 맞았다 !@!

1. 내 풀이: 성공

import sys
input = sys.stdin.readline

n = int(input())
maximum = 1003003
che = [False, False] + [True]*(maximum)

def palindrome(answer):
    for k in range(len(answer)//2):
        if answer[k] != answer[len(answer)-k-1]:
            return False
    return True

primes = []

for i in range(2, maximum):
    if che[i]:
        if i >= n:
            primes.append(i)
        for j in range(2*i, maximum, i):
            che[j] = False        

for i in primes:
    if palindrome(str(i)):
        print(i)
        exit()

뭔가 다소 복잡해보이나 ㅎㅎ... 응 뭐 일단 맞음 ㅎㅎ
풀이 방법은 다음과 같다.

  • palindrome 함수 : 소수를 받아 이 숫자가 팰린드롬인지를 알아보는 것이다. 이 부분은 쉽게 구현할수 있을텐데, 팰린드롬이 아닐 때 바로 빠져나오는 것 등을 구현하기 위해 함수로 구현했다.
  • 첫번째 for문 : 이 부분은 소수인지를 빠르게 확인할 수 있는 에라토스테네스의 체를 사용했다. 나중에 팰린드롬 확인을 할 때 불필요한 연산은 줄이기 위해 in보다 크다는 조건문을 넣어주었다. 다들 알겠지만 무조건 2부터 시작해야한다! 그래야지 배수를 걸러낼 수 있을텡께 ... (응 내 이야기 ...)
  • 두번째 for문 : 그리고는 들어온 숫자들을 팰린드롬인지 확인을 해주고, 팰린드롬이라면 출력 후 코드를 종료하게 된다. exit ... 꽤나 요긴하게 써먹는다.

처음에 틀렸던 이유는 경곗값을 고려해주지 않아서였다.
N이 1,000,000까지 들어온다고 하여 에라토스테네스의 체를 단순히 1,000,001까지 했다가 낭패를 보았다. 그래서 아예 maximum, 즉 체의 최댓값을 아주 크게 늘린 후 (1,500,000) 정답값 (1,003,001) 을 확인 후 그에 맞게 maximum 값을 조정해주었다.

2. 다른 풀이

import math

def isPrime(x): # 소수인지 판별해주는 함수
    for i in range(2, int(math.sqrt(x)+1)):
        if x % i == 0:
            return False
    return True

N = int(input())
result = 0

for i in range(N, 1000001): # 입력값 N 부터 최대값 까지 순환
    if i == 1: # 1은 소수가 아니기 때문에 예외처리
        continue
    if str(i) == str(i)[::-1]: # 팰림드롬 수 일 경우
        if isPrime(i) == True: # 소수 판별 함수 적용
            result = i
            break

if result == 0: # 입력값이 만약 최대 값 100만일 경우
    result = 1003001 # 100만 이상이면서 팰림드롬 및 소수일 경우를 적용

print(result)

풀이 출처: https://velog.io/@sangjin98/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%B1%EC%A4%80-1747%EB%B2%88-%EC%86%8C%EC%88%98%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC

이 분은 슬라이싱을 통해 팰린드롬을 확인해주었다. 오호 ... 다음부터는 비슷한 유형이 나오면 저런 방법을 써보아야겠다!

3. 마치며

슬슬 ... 다른 알고리즘으로 넘어가볼까 생각 중이다.
아마 다음 알고리즘은 그리디 알고리즘이 되지 않을까 ~~~

profile
정말 알아?

0개의 댓글