본문 바로가기
알고리즘/BOJ

[BOJ] 1644번 소수의 연속합 / 사용언어 : 파이썬(python)

by 바른 호랑이 2022. 2. 28.
728x90
반응형

※ 문제링크

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net

해당 문제는 에라토스테네스의 체로 숫자의 범위안의 소수 리스트를 작성하고, 투 포인터를 활용하여 연속된 소수의 합이 조건에 만족하는지 확인하면서 풀 수 있는 문제였다. 문제 조건 중 소수의 중복사용이 불가능하고 연속한 수들만 사용가능하다고 하였기에 해당 내용을 활용하여 문제에 대입하였으며, 채점결과 문제없이 작동하였다. 자세한 풀이방법과 코드는 아래와 같다.

1. 입력받은 값을 바탕으로 소수리스트를 출력할 함수를 작성하고, 변수 값을 저장해준다.

2. 포인터와 카운트해줄 변수를 작성하고, while 반복문을 통해 조건을 걸어 만족하는 수들의 조합 수를 확인한다. (0부터 포인터를 시작해서 N보다 합이 작으면 cp2를 +1, 그 이외의 경우는 cp1을 +1하는 식으로 작성하였다.)

3. 반복문 종료 후 결과값을 출력해준다. (입력값으로 1이 들어오는 예외경우가 있으므로, 해당 경우를 고려하여 코드를 작성하였다.)

 

def sosu_list(limit):
    checked = [True] + [False for _ in range(limit)]
    checked[1] = True
    numbers = []
    for i in range(len(checked)):
        if checked[i] == False:
            numbers.append(i)
            for k in range(i, len(checked), i):
                checked[k] = True
    return numbers

N = int(input())
numbers = sosu_list(N)
cp1, cp2 = 0, 0
K = len(numbers)

if N == 1:
    print(0)
else:
    cnt = 0
    check_value = 2
    while cp1 < K and cp2 < K:
        if check_value == N:
            cnt += 1
        if check_value < N and cp2 < K-1:
            cp2 += 1
            check_value += numbers[cp2]
        else:
            check_value -= numbers[cp1]
            cp1 += 1
    print(cnt)

 

P.S 더 나은 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글