본문 바로가기

PS/boj

(53)
백준 2616 소형기관차 https://www.acmicpc.net/problem/2616 2616번: 소형기관차 첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있 www.acmicpc.net 비교적 쉬운 dp였습니다. 기차의 길이가 정해져있기때문에 현재에서 기차 길이 이전만큼 위치의 최대값을 참조하여 현재 위치를 끝으로 기차를 한대 세운 값과 현재위치의 기차를 세우지않은 값(바로 전위치까지의 최대값)을 비교하여 dp배열에 기록하여 풀 수 있습니다. #include #include #include #include #include #include #include using names..
백준 1594 전화번호 만들기 https://www.acmicpc.net/problem/1594 1594번: 전화번호 만들기 첫째 줄에 영식이의 전화번호가 주어진다. 영식이의 전화번호는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9로만 이루어져 있으며, 전화번호의 길이는 2보다 크거나 같고, 1,000보다 작거나 같은 자연수이다. www.acmicpc.net 재귀와 백트래킹을 이용해 구현했습니다. 같은 품질이 나올경우 사전순으로 앞선 문자열을 출력하는 것이 중요한데 '-'문자는 숫자들보다 앞서므로 재귀를 통해 번호를 2개씩 끊고 번호를 3개씩 끊게되면 사전순으로 탐색하게 됩니다. 또한 번호 경우의 수를 탐색할때 해당위치까지 과거에 탐색했던 최대 품질보다 적을경우 뒤를 탐색할 필요가 없게됩니다. 이를 통해 시간복잡도를 줄일 수 있..
백준 14905 소수 4개의 합 https://www.acmicpc.net/problem/14905 14905번: 소수 4개의 합 모든 자연수를 4개의 소수의 합으로 나타낼 수 있을까? 이 물음에 대한 답은 '8 이상의 모든 자연수에 대해 그렇다'이지만, 데이빗은 그 사실을 알지 못했다. 데이빗은 프로그램을 돌려 4개의 소 www.acmicpc.net 골드바흐의 추측을 이용하는 문제였습니다. 골드바흐의 추측은 "2보다 큰 짝수는 소수 두개의 합으로 나타낼 수 있다."입니다. 우리는 8이상의 어떤 자연수가 주어져도 임의의 소수 두개를 빼서 짝수로 만들 수 있습니다. 짝수일경우 소수 2 2를 빼면 되고 홀수일경우 소수 2 3을 빼면 됩니다. 소수 4개의 합중 2개의 합을 구했으니 나머지는 미리 에라토스테네스의 체로 소수를 구하고 O(N/2..
백준 7347 플립과 시프트(C++) https://www.acmicpc.net/problem/7347 7347번: 플립과 시프트 이 퍼즐은 m개의 검은색 원판과, n개의 흰색 원판으로 이루어진 임의의 수열(sequence)이 타원형 모양의 트랙에 배치되어 있는 구조입니다. 또 이 게임에서는 플립(flip)이라는 동작을 할 수 있는 디 www.acmicpc.net 위와 같은 문제입니다. 문제에서 말하는 플립을 쉽게 말하면 한칸떨어진 원판과 위치를 바꿀수 있다는 것입니다. 여기서 우리가 생각해봐야 할것은 항상 한칸 떨어진 원판과 바꾼다는 점입니다. 수열이 원형으로 이어졌다고해서 어렵게 생각할 필요없습니다. 이 수열은 길이가 홀수인 수열과 길이가 짝수인 수열로 나눠 생각해볼수 있습니다. 예시를 들어 설명해드리겠습니다. 위는 길이가 짝수인 수열입..
백준 3042 트리플렛(C++) https://www.acmicpc.net/problem/3042 위와 같은 문제입니다. 처음에 문제를 봤을때 당황했었던 문제입니다. 문제는 N*N 격자 위에 있는 세 점이 같은 직선위에 있는 것을 트리플렛이라고 하는데 이의 개수를 찾는 문제였습니다. 제가 처음에 문제를 봤을때 점이 있을수 있는 위치는 N^2고 세점이므로 N^6이되니까 어떻게 풀지 막막했는데.... 역시 문제를 잘봐야 한다고 문제에 알파벳을 여러칸에 쓸수 없으므로 최대 N*N격자 위에 26개의 점밖에 올라갈수 없었습니다. 그러면 시간복잡도가 26^3이 되고 완전탐색을 통해 해결할 수 있습니다. 이제 완전탐색중 고른 세 점이 같은직선위에 있는지 확인해야하는데 세 점을 각각 A,B,C라고 하고 각각의 좌표를 A(Ax,Ay) B(Bx,By) ..