본문 바로가기

분류 전체보기

(87)
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) 최장 증가 부분 수열 - 나무위키 어떤 임..
BOJ 1655 가운데를 말해요 1655번: 가운데를 말해요 (acmicpc.net) 1655번: 가운데를 말해요 첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net 나는 multiset을 사용하여 풀었다. Naive한 방법으로 생각했을때, 배열을 탐색하여 중간값을 찾겠다고 한다면 시간복잡도 O(nm) 으로 시간초과가 될 것이라고 생각했다. 그래서 각 Query당 최대 O(log n) 만큼의 시간복잡도를 가지는 자료구조가 필요하다고 생각했고, 떠올린 것이 이진 트리였다. 그리고 숫자가 하나씩 들어오니까 다음 출력 값은 바로 전 출력된 값과 인접한 숫자들로 ..
BOJ 2169 로봇 조종하기 2169번: 로봇 조종하기 (acmicpc.net) 2169번: 로봇 조종하기 첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다. www.acmicpc.net 선 요약 : DP문제였다. 처음에는 다음 조건들 때문에 완전 탐색으로 풀어야하나 고민했었다. 1. 탐사한 지역은 다시 탐사하지 않는다. 2. 로봇은 배열에서 오른쪽, 왼쪽, 아래쪽으로 이동하지만, 위쪽으로 이동할 수 없다. (내가 지금까지 봤었던 DP문제들은 전부 한쪽 방향으로만 움직이면서 풀었기 때문에 왼쪽, 오른쪽 두방향으로 움직이는 이 조건 때문에 처음에는 DP라고 생각하지 못했다.) 하지만, 시..