본문 바로가기

분류 전체보기

(58)
백준 21940 가운데에서 만나기 (C++) https://www.acmicpc.net/problem/21940 21940번: 가운데에서 만나기 위 조건을 만족하는 도시 $X$의 번호를 출력한다. 만약 가능한 도시 $X$가 여러 개인 경우는 도시의 번호를 오름차순으로 출력한다. www.acmicpc.net 대놓고 다익스트라를 사용하라는 문제였습니다. (양의 간선 가중치) n=200 다익스트라를 모든 점을 시작점으로 두고 돌려 다른 점에 대한 거리를 구해 배열에 저장한뒤 마을에 대해 답을 구하는 연산을 하면 됩니다. #include #include #include #include #include #include #include #include #include #include using namespace std; void fast_io() { cin...
백준 16117 실버런 (C++) https://www.acmicpc.net/problem/16117 16117번: 실버런 첫 번째 줄에 맵에 있는 실버 주머니들이 이루는 직사각형의 행과 열 수를 나타내는 정수 N, M(1 ≤ N, M ≤ 1,000)이 공백을 사이에 두고 주어진다. 다음 N개의 줄에 걸쳐 각 줄에 M개의 정수가 주 www.acmicpc.net 예제부터 이해하기 힘든 문제 였습니다. 예제2에서 많이 당황했어요. 혹시 못본게 있나 살펴봤더니 문제에 "정수 좌표가 아니어도 된다"라는 조건이 있더라고요. 그제서야 이해했습니다. .5지점에서 실버 주머니를 먹으면서 이동할 수 있었습니다. 대신 .5지점에서 움직이게 될 경우 오른쪽으로 갈 경우 실버주머니를 먹지 못합니다. 이 경우를 주의하여 각각 정수좌표계에서 움직이는 dp .5좌..
Codeforces Round #802 (Div. 2) Virtual 후기 C번이 만만치않았습니다. D번은 문제에 대한 접근도 어렵더라고요. 결국 풀지 못했습니다. 에디토리얼을 보면 나중에 D까지 추가할 것 같습니다. A번은 n과 m의 등차수열합을 이용하는 문제였습니다. 가장 거리가 작은 경로는 윗변에서 오른쪽변으로 내려올수밖에없었습니다. 식은 (m*((m+1)/2-1))+((n*(n+1))/2*m) 이런 식으로 나오게 됩니다. B번은 어떤 수에 같은 자리수를 더해서 펠린드롬을 만드는 문제였습니다. 다만 10만자리라 파이썬으로 풀었으면 쉽게 풀 수 있는 문제일겁니다. 저는 c++이 익숙해서 문자열로 쪼개 풀었습니다. 앞자리가 9가 아닌이상 9*자리수 꼴로 만들면 쉽게 펠린드롬이 됩니다. 다만 앞자리가 9면 같은 자릿수를 더해서 9*자리수 꼴로 만들 수 없죠 따라서 1*(자릿수+..
백준 22345 누적거리 https://www.acmicpc.net/problem/22345 22345번: 누적 거리 KOI 나라는 수직선 위에 놓인 N개의 마을로 구성되어 있다. 이 중 i (1 ≤ i ≤ N)번째 마을은 xi 위치에 놓여 있으며 ai명이 거주 중이다. 또한 서로 다른 두 마을이 같은 위치에 놓인 경우는 없다. KOI www.acmicpc.net 마을이 총 20만개 이며 거리질의 또한 20만이므로 O(N^2)시간복잡도로 풀수 없습니다. 즉, 한 마을에 대해서 모든 마을의 거리를 계산하면 시간초과가 납니다. 따라서 우리가 배열에 흔히 쓰는 prefix sum을 마을에 대한 누적 거리 합을 저장하면 됩니다. 저는 마을 사람수를 정렬한 후 참조하려고 map을 썼지만 풀고 나니 map을 안썼어도 좋았겠네요. 거리 질의..
백준 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 위와 같은 문제입니다. 문제에서 말하는 플립을 쉽게 말하면 한칸떨어진 원판과 위치를 바꿀수 있다는 것입니다. 여기서 우리가 생각해봐야 할것은 항상 한칸 떨어진 원판과 바꾼다는 점입니다. 수열이 원형으로 이어졌다고해서 어렵게 생각할 필요없습니다. 이 수열은 길이가 홀수인 수열과 길이가 짝수인 수열로 나눠 생각해볼수 있습니다. 예시를 들어 설명해드리겠습니다. 위는 길이가 짝수인 수열입..