본문 바로가기

알고리즘

(60)
BOJ 1445 일요일 아침의 데이트 www.acmicpc.net/problem/1445 1445번: 일요일 아침의 데이트 첫째 줄에 숲의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 3보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 숲의 지도가 주어진다. 숲의 지도는 S, F, g, . 만으로 이루어져 있 www.acmicpc.net greedy하게 다음 경로를 선택하는 쪽으로 구현하면 될 것 같아서 다익스트라를 사용하였다. cost는 {쓰레기가 차있는 칸을 지나간 수, 쓰레기가 인접한 칸을 지나간 수} 로 해도 되지만, 나는 구현의 편의성 때문에 cost를 (쓰레기가 차있는 칸을 지나간 수) * 100000 + (쓰레기가 인접한 칸을 지나간 수) 로 하여 구현하였다. 코드는 다음과 같다. #include #in..
BOJ 1761 정점들의 거리 www.acmicpc.net/problem/1761 1761번: 정점들의 거리 첫째 줄에 노드의 개수 N이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리를 입력받는다. 그 다음 줄에 M이 주어지고, 다음 M개의 줄에 거리를 알고 싶은 노드 쌍이 한 줄에 한 쌍씩 www.acmicpc.net 예전에 틀린 문제들을 다시 풀어봤다. 이 문제는 가중치가 있는 tree에서 정점들의 거리를 구하는 문제이다. LCA를 구해서 cost[a] + cost[b] - 2*cost[lca] 를 구해주면 된다. (cost[i]는 root node 로부터 node i까지의 거리, dfs로 먼저 구해놓는다.) 여기까지는 쉽게 생각할 수 있을 것이다. 하지만, query의 존재 때문에, 하나하나 올라가서 LCA를 찾..
BOJ 1074 Z 1074번: Z (acmicpc.net) 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서 www.acmicpc.net 우연히 눈에 들어와서 다시 풀어보게 되었다. 3년전에는 시간초과로 풀지 못했었는데, 이번엔 간단히 풀 수 있었다. 요약하자면, 분할정복이다. Map을 4분할 했을때, r,c의 위치에 따라 r,c보다 앞쪽에서 탐색되는 좌표들의 개수를 대략적으로 알 수 있고, 그 다음 좌표를 shift시키면서 이를 반복한다면, 답을 구할 수 있다. 각 구역의 좌표들은 다음과 같은 특징을 가진다. 1구역 : r < 2^(n-1), c ..
BOJ 2014 소수의 곱 www.acmicpc.net/problem/2014 2014번: 소수의 곱 첫째 줄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 K개의 소수가 오름차순으로 주어진다. 같은 소수가 여러 번 주어지는 경우는 없으며, 주어지는 소수는 모두 541보다 작거나 www.acmicpc.net 처음에는 arr[i] = i번째 합성수 를 사용하여 값을 저장하려고 했다. 하지만, i+1번째 합성수를 구하기 위해서는 1~i번째 합성수와 단위소수들을 각각 곱한 값들 중 가장 작은 값을 하나 뽑아야하기 때문에, 시간복잡도가 O(kn^2) 이 걸려 다른 방법을 찾기로 했다. 여기서 "arr[i] = i번째 작은 수"라는 것에 착안하여 배열 대신 priority queue를 사용하기로 ..
BOJ 2629 양팔 저울 www.acmicpc.net/problem/2629 2629번: 양팔저울 첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무 www.acmicpc.net 예전에 학교에서 풀었던 거스름돈 문제(거스름돈 단위들의 최대 공약수가 1)와 매우 유사했다. 단, 이 문제는 반대쪽에서도 거스름돈을 제시하여 가격을 맞출 수 있다는 조건이 추가되었다고 생각하였다. 마치 현실에서 6000원 어치를 샀는데, 사장님이 1000원짜리는 없고 5000원 짜리만 있어서 우리가 11000원을 주고 5000원을 거슬러 받는 경우랑 유사하다고 생각하였다. 이에 따른 점화식은 다음과 같다. DP[..
BOJ 17142 다리 만들기 2 www.acmicpc.net/problem/17472 17472번: 다리 만들기 2 첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. 둘째 줄부터 N개의 줄에 지도의 정보가 주어진다. 각 줄은 M개의 수로 이루어져 있으며, 수는 0 또는 1이다. 0은 바다, 1은 땅을 의미한다. www.acmicpc.net DFS + 크루스칼 문제이다. 섬을 알아내기 위해 DFS로 섬 영역을 탐색했고, 탐색하면서 번호를 붙여 같은 섬이면 같은 번호가 할당하게끔 했다. 간선을 알아내기 위해 섬의 격자에서 상하좌우로 탐색을 실시했고, 지도의 끝부분에 가거나 격자의 값이 0이 아닐 때 까지 탐색했다.도착한 격자의 값이 0이 아니면, {거리, {시작 격자, 도착 격자}} 의 구조로 edge에 추가하였다. 이때, 시작..
BOJ 17143 낚시왕 www.acmicpc.net/problem/17143 17143번: 낚시왕 낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. www.acmicpc.net 구현 문제이다. 문제가 준 대로 구현하면 되지만, 살짝의 최적화가 있어야 시간초과를 안받을 수 있다. 속도가 0 ≤ s ≤ 1000 이기 때문에 이것을 한칸한칸씩 옮겨가며 확인한다면 시간초과를 받는다 (내가 그랬다) 좌우로 움직이는 상어의 경우 2*(c-1) 의 주기로 위치가 반복되고, 상하로 움직이는 상어의 경우 2*(r-1)의 주기로 위치가 반복되니, 속력을 입력 받는 과정에서 처리해주어..
BOJ 1365 꼬인 전깃줄 1365번: 꼬인 전깃줄 (acmicpc.net) 1365번: 꼬인 전깃줄 첫 줄에 전봇대의 개수 N(1 ≤ N ≤ 100,000)이 주어지고, 이어서 N보다 작거나 같은 자연수가 N개 주어진다. i번째 줄에 입력되는 자연수는 길 왼쪽에 i번째 전봇대와 연결된 길 오른편의 전봇대가 www.acmicpc.net 처음에는 그냥 점화식있는 DP인줄 알았지만, 최장 증가 수열 문제이다. 근데 내가 구현할 수 있는 최장 증가 수열은 O(N^2)의 시간복잡도를 가져서 예전에 풀었던 코드를 적용할 수가 없었다. (이문제의 n은 100000) 그래서 어쩔수 없이 시간복잡도가 더 좋은 최장 증가수열 알고리즘을 참고를 했다. 최장 증가 부분 수열 - 나무위키 (namu.wiki) 최장 증가 부분 수열 - 나무위키 어떤 임..