본문 바로가기

Programming456

[C/C++] 백준 #1644 소수의 연속합(수학) 이번 문제는 연속된 소수들의 합을 이 주어진 값으로 표현되면, 그러한 경우의 수를 계산하는 것입니다. 원래는 소수들의 누적합을 이용해서 푸는 것이 좋겠죠. 먼저 n보다 작거나 같은 소수들의 집합을 구합니다. n이 30이라고 한다면 아래와 같은 소수들 리스트를 얻게 됩니다. 2 3 5 7 11 13 17 19 23 29 누적합은 다음과 같이 구할 수 있습니다. 우리는 이 누적합 테이블만 사용하면 됩니다. 2 5 10 17 28 41 58 77 80 109 이 누적합 테이블은 실제 연속된 합을 계산할 때 사용합니다. 제일 먼저 이분탐색을 이용해서 30을 찾습니다. 해당 값은 첫 소수부터 연속된 소수의 합이 30이 되는 경우입니다. 맨 처음 누적합에 0을 넣는다면 이 부분을 생략해도 됩니다. 이제 109부터 .. 2022. 9. 17.
[C/C++] 백준 #1613 역사(플로이드 와샬) 이번 문제는 역사적 사건의 전후 관계가 주어졌을 때, 그 관계를 이용해서 다른 두 사건의 선후관계를 유추하는 방법입니다. 선후 관계가 있으니, 위상 정렬을 사용할 수도 있는데, 저는 그것보다는 유향 그래프라고 생각하고 플로이드 와샬(Floyd Warshall) 알고리즘을 이용했습니다. 플로이드 와샬 알고리즘을 이용하면 모든 정점 사이의 연결관계를 파악할 수 있습니다. 하지만, 알고리즘의 점근적 분석이 \(O(V^3)\)이라는 단점이 있죠. 모순이 생기지 않는 연결관계이므로 사실 \(O(V^3)\)번 반복할 필요는 없습니다. 그렇지만 그냥 오리지날 플로이드 와샬 알고리즘을 이용해서 풀었습니다. https://www.acmicpc.net/problem/1613 1613번: 역사 첫째 줄에 첫 줄에 사건의 개.. 2022. 9. 13.
[Python] 프로젝트오일러 #80 제곱근 확장(수학) 이번 문제는 난이도 20%입니다. 사실 이 문제의 뜻을 정확하게 파악하는데 좀 문제가 있습니다. 영어권 사용자들에게도 헷갈리는 문제이기도 하죠. https://projecteuler.net/problem=80 일단 중요한 것은 이 문제를 풀기 위해서는 큰 정수 계산을 할 수 있거나, 높은 정밀도의 실수 연산이 필요합니다. 이미 알고있는 32비트 실수형이나 64비트 실수형은 정밀도가 그렇게 높지 않습니다. 32비트 실수형은 유효자리수가 6자리정도이고, 64비트 실수형은 유효자리수가 15자리 정도입니다. 그런데 이 프로그램은 100자리 이상의 유효자리수를 요구합니다. 일단 문제를 해석하면, \(\sqrt{2}\)와 같은 자연수의 제곱근은 무한소수로 표현됩니다. \( \sqrt{2} = 1.4142135623.. 2022. 9. 13.
[C/C++] 백준 #1600 말이 되고픈 원숭이(너비 우선 탐색) 이번 문제는 너비 우선 탐색으로 풀었습니다. 그래프 이론 중에 프림 알고리즘, 다익스트라 알고리즘, 그리고 A* 알고리즘 모두 너비 우선 탐색(Bredth First Search)이 기초가 됩니다. 이 문제에서 너비 우선 탐색을 쓴 이유는 노드간의 간선의 값이 1이기 때문입니다. https://www.acmicpc.net/problem/1600 1600번: 말이 되고픈 원숭이 첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있 www.acmicpc.net 그렇지만, 말(knight)의 이동이 k번으로 제한된다는 것때문에 별도의 자료를 사용해야 합니다. 일단.. 2022. 9. 11.
백준 #1572 중앙값(힙) 이번 문제는 N개의 데이터가 들어올 때, K개의 연속된 값 구간의 중앙값을 구해야 하는 문제입니다. 일반적으로 N개의 정렬되지 않은 데이터가 주어졌을 때, 중앙값을 구하는 것을 \(O(N)\) 알고리즘으로 가능합니다. N개의 데이터에 K개의 연속된 값 구간은 \(N-K+1\)개가 존재합니다. 만약, 위의 방법으로 하고자 한다면, \(O(NK)\) 알고리즘으로 풀어야 합니다. 그런데 문제에서 N의 최대값을 250,000, K의 최대값은 5,000으로 \(O(NK)\) 알고리즘으로 풀게 되면 시간초과가 될 것이 뻔합니다. https://www.acmicpc.net/problem/1572 1572번: 중앙값 중앙값이란, 수열을 정렬했고, 그 크기가 N일 때, 1부터 시작해서 (N+1)/2번째 있는 원소가 그 .. 2022. 9. 7.
[C/C++] 백준 #1563 개근상(동적계획법) 개근상 문제는 동적계획법을 이용하는 문제이지만, 조건이 조금 까다롭습니다. 연속결석이 3번 이어지면 안 되기 때문에 당연히 동적 계획법을 사용하는 것이 바람직합니다. 그런데 지각 정보도 있으니까요. 출석은 O, 결석은 A, 지각은 L로 표현했을 때, 5일간 출석 정보를 가지고 개근상을 따진다면, OOOOO와 같은 경우는 당연히 되겠죠. AALAL 과 같이 지각을 두번 이상한 경우에는 개근상을 받지 못합니다. AALAA와 같이 4번 결석에 1번 지각의 경우는 개근상을 받겠죠. https://www.acmicpc.net/problem/1563 1563번: 개근상 백준중학교에서는 학기가 끝날 무렵에 출결사항을 보고 개근상을 줄 것인지 말 것인지 결정한다. 이 학교는 이상해서 학생들이 학교를 너무 자주 빠지기 .. 2022. 9. 6.
728x90