본문 바로가기
반응형

Problem Solving/백준53

백준 2075 : N번째 큰 수 https://www.acmicpc.net/problem/2075 2075번: N번째 큰 수 첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다. www.acmicpc.net [ 문제풀이 ] 구하고자 하는 것이 N번째로 큰 수이기 때문에 최소 힙 형태의 우선순위 큐를 활용하여 N개의 큰 수를 관리해주면 된다. 우선순위 큐 크기가 N보다 작을 때는 수를 삽입해주고, N개일 때부터는 현재 수가 최솟값보다 큰 경우 갱신해주면 된다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputSt.. 2021. 9. 18.
백준 12738 : 가장 긴 증가하는 부분 수열 3 https://www.acmicpc.net/problem/12738 12738번: 가장 긴 증가하는 부분 수열 3 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net [ 문제풀이 ] 전형적인 LIS를 구하는 문제이다. 일반적으로 LIS는 DP로 구하지만 N이 최대 1,000,000이기 때문에 O(N^2)의 시간 복잡도로는 해결할 수 없다. 이는 세그먼트 트리나 LowerBound를 활용하면 O(NlogN)의 시간 복잡도로 해결할 수 있다. 나는 구현하기 더 간단한 LowerBound로 해결하였다. 다만, LowerBound를 활용.. 2021. 9. 12.
백준 11085 : 군사 이동 https://www.acmicpc.net/problem/11085 11085번: 군사 이동 전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여 www.acmicpc.net [ 문제풀이 ] 크루스칼 알고리즘을 활용해서 c, v가 연결될 때까지 가장 넓은 길부터 차례대로 연결해주면 되는 문제이다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWr.. 2021. 9. 8.
백준 13397 : 구간 나누기 2 https://www.acmicpc.net/problem/13397 13397번: 구간 나누기 2 첫째 줄에 배열의 크기 N과 M이 주어진다. (1 ≤ N ≤ 5,000, 1 ≤ M ≤ N) 둘째 줄에 배열에 들어있는 수가 순서대로 주어진다. 배열에 들어있는 수는 1보다 크거나 같고, 10,000보다 작거나 같은 자연수 www.acmicpc.net [ 문제풀이 ] 최적해를 구하는 문제이기 때문에 결정 문제로 변경하여 파라메트릭 서치를 활용하면 해결할 수 있는 문제이다. key 값을 기준으로 구간을 나눴을 때 M보다 작다면 정답이 가능하기 때문에 더 작은 key값을 탐색해주고, M보다 크다면 정답이 불가능하기 때문에 더 큰 key값으로 탐색해준다. import java.io.BufferedReader; i.. 2021. 9. 6.
백준 9470 : Strahler 순서 https://www.acmicpc.net/problem/9470 9470번: Strahler 순서 지질학에서 하천계는 유향그래프로 나타낼 수 있다. 강은 간선으로 나타내며, 물이 흐르는 방향이 간선의 방향이 된다. 노드는 호수나 샘처럼 강이 시작하는 곳, 강이 합쳐지거나 나누어지는 곳 www.acmicpc.net [ 문제풀이 ] 기본적인 위상 정렬에 각 노드의 order만 관리해주면 쉽게 해결할 수 있는 문제이다. order의 조건이 2개이기 때문에 count 배열을 하나 선언하여 같은 값이 진입할 경우 개수를 저장해준다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; impor.. 2021. 9. 4.
백준 1029 : 그림 교환 https://www.acmicpc.net/problem/1029 1029번: 그림 교환 첫째 줄에 예술가의 수 N이 주어진다. N은 2보다 크거나 같고, 15보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 N개의 수가 주어진다. i번째 줄의 j번째 수는 j번 예술가가 i번 예술가에 www.acmicpc.net [ 문제풀이 ] 외판원 문제와 비슷한 문제로 모든 경우의 수를 탐색하면 TLE가 발생하지만 비트마스킹 + DP를 활용하여 경우의 수를 탐색하면 해결할 수 있는 문제이다. dp 테이블을 다음과 같이 정의하자. dp[i][j] : 현재 방문한 정점의 상태가 i이며 j번째 사람(현재 그림 소유)이 그림을 구매한 비용 이렇게 정의한 이유는 방문한 정점의 상태가 같은 상황에서 j번째 사람이 누구에.. 2021. 8. 31.
백준 2234 : 성곽 https://www.acmicpc.net/problem/2234 2234번: 성곽 첫째 줄에 두 정수 n, m이 주어진다. 다음 m개의 줄에는 n개의 정수로 벽에 대한 정보가 주어진다. 벽에 대한 정보는 한 정수로 주어지는데, 서쪽에 벽이 있을 때는 1을, 북쪽에 벽이 있을 때는 2를, www.acmicpc.net [ 문제풀이 ] 서북동남 순서로 1,2,4,8의 값을 가지기 때문에 (1~4)번째 bit가 1인지를 확인해주면 벽이 존재하는지 판단할 수 있다. 따라서 dfs + 비트마스킹을 통해 탐색하면서 방마다 인덱스를 매겨주고 각 방의 넓이를 저장해준다. 이렇게 하면 1, 2번을 해결할 수 있다. 3번을 해결하기 위해서 벽을 제거하였는지를 판단하는 변수를 하나 두고 dfs를 수행해도 되지만 어차피 벽들.. 2021. 8. 30.
백준 5624 : 좋은 수 https://www.acmicpc.net/problem/5624 5624번: 좋은 수 정수 N개로 이루어진 수열 A가 있다. 이때, i번째 수가 그 앞에 있는 수 세 개의 합으로 나타낼 수 있을 때, 그 수를 좋다고 한다. (같은 위치에 있는 수를 여러 번 더해도 된다) 수열이 주어졌을 때 www.acmicpc.net [ 문제풀이 ] "A + B + C = D"를 "A + B = D - C"로 생각하는 것이 포인트인 문제이다. 또한, A + B로 만들 수 있는 수는 -200000~200000이기 때문에 배열을 하나 선언하여 해당 숫자 존재 유무를 빠르게 알 수 있도록 해준다. import java.io.BufferedReader; import java.io.BufferedWriter; import ja.. 2021. 8. 29.
백준 5214 : 환승 https://www.acmicpc.net/problem/5214 5214번: 환승 첫째 줄에 역의 수 N과 한 하이퍼튜브가 서로 연결하는 역의 개수 K, 하이퍼튜브의 개수 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) 다음 M개 줄에는 하이퍼튜브의 정보가 한 줄에 하나씩 주어 www.acmicpc.net [ 문제풀이 ] "백준 2021 : 최소 환승 경로" 문제와 거의 비슷한 문제이다. 역이 아닌 하이퍼튜브를 정점으로 두는 아이디어를 적용한다면 쉽게 해결할 수 있다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.Outp.. 2021. 8. 27.
반응형