본문 바로가기

백준

(12)
[Baekjoon Online Judge] 12865. 평범한 배낭 (Java) https://www.acmicpc.net/problem/12865 설명핵심용량이 제한된 배낭에 넣을 수 있는 최대 가치를 구하는 유명한 문제인 Knapsack Problem 그 중에서 0/1 Knapsack Problem과 동일한 문제이다. 가장 단순한 방법을 생각해보자. 물품의 개수는 최대 100개 이다. 따라서 물품을 넣거나 넣지 않거나 두가지 선택지를 100개 물품에 대해 모두 적용하고 가치를 확인한다면, 2^100가지 상황을 검사해야 한다. 즉, 물품의 개수 N에 대해 시간복잡도가 O(2^N)이다. 즉, 시간복잡도를 줄일 방법을 떠올리는 것이 핵심이다. 하지만 이 문제는 워낙 유명하고 떠올리기 쉽지 않기 때문에 그냥 한번 풀어보는 것이 현명한 방법이라고 생각한다.구현알려진 방법에 따라 시간복잡도..
[Baekjoon Online Judge] 2839. 설탕 배달 (C++, Java) https://www.acmicpc.net/problem/2839 설명핵심이 문제의 핵심은 5kg 봉지가 많을수록 더 적은 봉지로 채울 수 있다는 것이다.단, 주어진 용량을 꽉 채워야 한다. 그리고 N이 최대값인 5000일 때, 가장 무식한 방법으로 푼다고 생각해보자.1. 먼저 5kg 봉지만으로 채워본다.2. 그 다음 3kg 봉지를 1개 넣고 나머지를 모두 5kg 봉지로 채워본다....?. 3kg 봉지만으로 채워본다딱 봐도 너무 무식해서 이렇게 풀고싶지는 않을 것이다.위 방식의 문제는 최초에 5kg으로 채우는 과정에서 알아낸 데이터를 다 버리고 다음 단계에서 새로 시작한다는 것이다.따라서 앞서 계산한 부분 문제의 해를 기억하여 반복을 줄이는 동적 프로그래밍을 사용하면 될 것 같다.구현두 서로 다른 언어와..
[Baekjoon Online Judge] 11286. 절댓값 힙 (C++, Java) https://www.acmicpc.net/problem/11286설명 핵심대놓고 힙을 사용하라고 했기 때문에 따로 생각할 요소는 없다.힙은 라이브러리에 포함된 우선순위 큐를 사용하면 되고주어진 조건에 맞게 비교 함수를 구현하는 방법만 학습하면 된다.구현Code (Java)비교 함수를 람다로 구현했다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.PriorityQueue;public class Main { public static void main(String[] args) throws IOException { StringBuilder sb =..
[Baekjoon Online Judge] 19951. 태상이의 훈련소 생활 (Java) 핵심N과 M이 최대 100,000이다.완전 탐색 시, 최악의 경우 시간복잡도가 O(NM)이므로 시간초과이다. 이와 같이 큰 범위를 다룰 때, 시간을 줄이기 위한 방법의 하나로 누적합이 있다.누적합이름에서 유추할 수 있듯이 값을 계속해서 쌓는 것이다.e.g. [1, 2, 3, 4, 5] 의 누적합을 원소로 하는 배열은 [1, 3, 6, 10, 15] 기존 배열의 인덱스 2~4 범위의 합을 구하려면, 가장 단순한 방법은 해당 범위를 순회하며 일일이 합하는 것이다. 누적합 배열 acc를 이용하면 acc[4] - acc[1]로 O(1)에 계산할 수 있다. 이 문제의 경우는 누적합 아이디어를 사용하면 해결할 수 있다. 우선 상태를 기록할 새로운 배열 acc를 만든다.조교 1이 2~4번 칸에 흙을 3만큼 쌓으라고 ..
[Baekjoon Online Judge] 1822. 차집합 (Java) 핵심두 배열의 길이가 500,000이다.따라서 배열 A의 각 원소가 배열 B의 원소에 포함되어 있는지 일일이 확인한다면 시간복잡도는 O(N^2)이 된다. (시간 초과) 따라서 시간복잡도를 줄여야 한다.원소가 많은 배열에서 특정한 원소가 포함되어 있는지 확인해야하는 문제이다.이분 탐색에 대해 알고 있다면 대부분 쉽게 떠올릴 수 있을 것이다. (모르겠다면 이분 탐색, 3분 안에 이해하기 참고) 그럼 시간복잡도는 O(NlogN)으로 줄고 여유있게 풀 수 있다.Code (Java)import java.io.IOException;import java.util.*;import static java.util.Collections.binarySearch;public class Main { public static..
[Baekjoon Online Judge] 14719. 빗물 (Java) https://www.acmicpc.net/problem/14719 핵심특정 지점을 기준으로 두 값을 찾는다.1. 해당 지점의 블록 높이2. 해당 지점을 기준으로 왼쪽의 땅에서 가장 높은 블록과 오른쪽 땅에서 가장 높은 블록 중에서 더 낮은 블록을 찾는다. 2번 값이 해당 지점에서 빗물이 최대로 쌓일 수 있는 높이이다.따라서 2번과 1번의 차가 해당 지점에서 쌓일 수 있는 빗물의 최대 높이(만약 이 차가 0 이하라면 빗물이 한 칸도 쌓일 수 없는 상태)+ 양 끝은 빗물이 쌓일 수 없다.구현나는 왼쪽을 기준으로 현재 인덱스까지 지점에서 가장 높은 블록의 높이를 배열에 저장했다. (누적합)e.g. highestFromLeft[10] : 0 ~ 10 지점 중에서 가장 높은 블록의 높이 오른쪽도 똑같이 구한 후..
[Baekjoon Online Judge] 1620. 나는야 포켓몬 마스터 이다솜 https://www.acmicpc.net/problem/1620 핵심N, M은 최대 100,000이다. 배열의 인덱스는 숫자이기 때문에포켓몬 번호가 주어졌을 때 포켓몬 이름을 찾는 것은 배열로 가능하지만포켓몬 이름이 주어졌을 때 포켓몬 번호를 찾는 것은 배열로 불가능하다.그렇다고 일일이 배열을 탐색하면 O(N)의 탐색을 N번 수행하므로 O(N^2)의 시간복잡도가 된다. (시간 초과) 따라서 String으로 O(1)에 탐색이 가능하면서 Key, Value 형태로 데이터를 저장하여 대응하는 포켓몬 번호까지 쉽게 가져올 수 있는 해시 맵을 사용할 것이다. Code (Java)import java.io.BufferedReader;import java.io.InputStreamReader;import java...
[Baekjoon Online Judge] 7785. 회사에 있는 사람 (C++, Java) https://www.acmicpc.net/problem/7785 핵심N은 최대 1,000,000이다.leave 로그마다 모든 enter 로그를 일일이 찾는 방법을 사용했을 때,만약 N/2개의 enter 로그가 연달아 나오고 그 다음 N/2개의 leave 로그가 연달아 나온다면N/2개의 enter 로그를 N/2개의 leave 로그에 대해 탐색해야 하므로 O(N^2)의 시간복잡도를 갖는다. (시간초과) 따라서 탐색 시간을 줄여야 한다. 여러 방법이 있는데 나는 해시 자료구조를 사용하는 방법을 사용했다.해시 자료구조의 탐색은 O(1)의 시간복잡도를 갖는다.이를 활용하면 앞선 상황에서 O(N)의 시간복잡도를 갖는다.Code (C++) with std::unordered_set#include #include u..

728x90
반응형