본문 바로가기

코드연습

(48)
BOJ 9020 : 골드바흐의 추측[pypy3] 문제 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다. 골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다. 2보다 큰 짝수..
BOJ 4948 : 베르트랑 공준 문제 베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다. 예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23) 자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오. 풀이 사실 이 문제는 그냥 풀이를 하기 보다는 '저런 공부를 하는 사람도 있구나'하는 생각에 코드를 공유한다. 앞에 푼 에라토스테네스의 체 같은 문제가 차라리 세상 사는데 도움은 되는 거..
BOJ 1929 : 소수 구하기 문제 M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오. 풀이 소수 구하는 문제라고 되어 있는데, 기존 방식대로 그리디하게 풀게 되면 시간 초과가 발생한다.(1 ~ 1000000)영역을 줄 경우. 그래서 이틀 테스트 해보고 실패해보고, 찾은 소수의 배수만큼을 미리 빼 버리면 될까? 싶어서 찾아보니 역시... 이미 예전에 누군가가 생각을 했던 문제였다. '에라토스테네스의 체'라는 방법인데, 체는 '거름 망'이다. 이것은 이미 구해둔 값의 이후 뒷 부분은 다시 반복 될 필요가 없기 때문에 앞으로 계산 할 부분에서 빼버리는 기법인데, 아이디어가 충분히 소수 구하는 문제 외에도 고안될 수 있을 것 같다. ※ 다만, 안전과 관련된 부분에서는 쉽게 적용 했다가 문제가 생길 것 같기도 함. 여튼, 벤치마킹(..
BOJ 1165 : 소인수 분해 문제 정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오. 풀이 소인수 분해는 가장 작은 나눠지는 인수들로 분해하는 것인데, 나는 컴퓨터 속도를 믿고,, 시간복잡도가 O^2 인 계산을 때려버렸다. 그 이유는 중간에 break 문이 있기 때문에 간헐적으로 큰 값이 아니면 충분히 커버가 가능할 것이라 생각했기 때문 그래서 해답은 2부터 주어진 수인 10000000까지 차례로 나누다가 나누어 떨어지는 수가 있으면 추가하고 break를 건다, 그리고 해당 값으로 N을 나눴을 때 1이하로 떨어지면 처음의 while을 멈춘다. import sys if __name__ == '__main__': n = int(sys.stdin.readline()) soinsu_list = [] while n > 1: for..
BOJ 2581 : 소수 문제 자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다. 풀이 이전 문제와 동일하지만, 범위를 주고 풀어라는게 추가되었다. 이전 문제와 달리 범위가 있으므로 시간복잡도가 증가하게 되면 시간초과가 의심되었다. 그래서 처음부터 전체 소수의 범위를 줬기 때문에 이를 활용해서 prime_list를 구하고 거기서 범위내에 있는 소수들만 추렸다. from re import X import sys if __name__ == '__..
BOJ 1978 : 소수 찾기 문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 풀이 소수는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수이다. 즉 1이면 소수가 아니고, 2이상의 수부터 N까지 나눴을 때, 나누어 떨어지는 수는 제외하면 된다. import sys if __name__ == '__main__': n = int(input()) a = list(map(int, input().split())) count = n for i in a: if i == 1: count -= 1 continue for j in range(2, i): if i % j == 0: count -= 1 break print(count) 이 문제도 갑자기 소수의 정의가 생각이 안나서 다시 찾아보고 풀었다. 근..
BOJ 2839 : 설탕배달 문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오. 풀이 import sys # 그리디 알고리즘 if __name__ == '__main__': N = int(sys.stdi..
BOJ 2775 : 부녀회장이 될테야 문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. 풀이 import sys def data_sum(data_list, n): floor_d_list = [] ..