본문 바로가기

728x90

문제풀이

(16)
백준 8987 수족관 3 (KOI 2013 4번) 문제 설명(링크) https://www.acmicpc.net/problem/8987 8987번: 수족관 3 입력의 첫 줄은 수족관의 경계에 있는 꼭짓점의 개수 N(4 ≤ N ≤ 300,000)이 주어진다. N은 짝수이다. 수족관의 경계는 항상 꼭짓점 (0, 0)부터 시작한다. 그리고 마지막 꼭짓점은 (A, 0)의 형태로 끝난 www.acmicpc.net 풀이 풀이가 다양한 것 같은데, 내가 푼 풀이 기준으로 설명하겠다. 우선 수족관의 모양이 히스토그램과 유사하므로, 카르테시안 트리로 모델링할 수 있다. 수족관을 카르테시안 트리로 모델링하면 특정 정점을 선택하면 그 정점과 그 정점의 모든 조상 정점에 해당하는 영역의 물이 빠진다. 또한 한번 물이 빠진 영역은 당연하게도 물을 다시 뺄 수 없다. 이런 특성들..
백준 16977 히스토그램에서 가장 큰 직사각형과 쿼리 문제 설명(링크) www.acmicpc.net/problem/16977 16977번: 히스토그램에서 가장 큰 직사각형과 쿼리 히스토그램은 직사각형 여러 개가 아래쪽으로 정렬되어 있는 도형이다. 각 직사각형은 같은 너비를 가지고 있지만, 높이는 서로 다를 수도 있다. 예를 들어, 왼쪽 그림은 높이가 2, 1, 4, 5, 1, 3, 3 www.acmicpc.net 문제 요약 [l, r]영역의 직사각형만 사용하여 너비가 w인 직사각형 중 가장 넓이가 큰 것을 출력하는 문제이다. 풀이 과정 너비가 정해져 있으므로, 높이가 가장 큰 것이 넓이가 가장 크다. 또, 높이가 h인 직사각형이 존재하면 h-1인 직사각형도 존재하므로, h에 대한 이분탐색을 할 수 있다. 높이가 h인 직사각형이 존재한다는 것의 필요충분조건은..
BOJ 1017 소수 쌍 문제 지민이는 수의 리스트가 있을 때, 이를 짝지어 각 쌍의 합이 소수가 되게 하려고 한다. 예를 들어, {1, 4, 7, 10, 11, 12}가 있다고 하자. 지민이는 다음과 같이 그룹지을 수 있다. 1 + 4 = 5, 7 + 10 = 17, 11 + 12 = 23 또는 1 + 10 = 11, 4 + 7 = 11, 11 + 12 = 23 수의 리스트가 주어졌을 때, 지민이가 모든 수를 다 짝지었을 때, 첫 번째 수와 어떤 수를 짝지었는지 오름차순으로 출력하는 프로그램을 작성하시오. 위의 예제에서 1 + 12 = 13으로 소수이다. 그러나, 남은 4개의 수를 합이 소수가 되게 짝지을 수 있는 방법이 없다. 따라서 예제의 답은 4, 10이다. 입력 첫째 줄에 리스트의 크기 N이 주어진다. N은 50보다 작..
BOJ 1321 군인 문제 캠프 내내 그랬듯이, 여전히 옆 나라와의 전쟁이 한창이다. 전쟁에는 N개의 부대가 투입되었는데, 전쟁이 장기전이 되다 보니 군사의 적절한 배치를 위해 각 부대에 군인이 늘어나기도 하고 줄어들기도 하고 있다. 행정의 편의를 위해 각 군인들에겐 번호가 붙어 있는데, 군인들은 1번 부대부터 군번순서대로 차례차례 배치된다. 예를 들어 1번 부대에 4명, 2번 부대에 3명, 3번 부대에 7명의 군인이 있다면 군번이 6번인 군인은 2번 부대에 배치되게 된다. 문제는 어떤 부대의 인원이 늘어나거나 줄어들었을 때 i번 군인이 어디에 배치되는지 인데, 이럴 때에는 군인도 군번도 처음부터 다시 배치하게 된다. 위의 예에서와 같이 1번 부대에 4명, 2번 부대에 3명, 3번 부대에 7명의 군인이 있었는데, 1번 부대에..
BOJ 1849 순열 문제 1부터 N까지의 수들이 한 번씩 쓰인 수열이 있다. 그 수열에서 i 앞에 있는 수 들 중, i보다 큰 수들의 개수를 A[i]라고 정의하자. A[i]가 주어져 있을 때, 원래 수열을 구하는 프로그램을 작성하여라. 입력 첫째 줄에 수열 원소의 개수 (1 ≤ N ≤100,000)이 주어진다. 그리고 두 번째 줄부터 N+1 번째 줄까지 차례로 A[i]가 주어진다. 출력 N개의 줄에 걸쳐서 수열을 출력한다. (i번째 줄에는 i번째 원소를 의미한다) 예제 입력 1 8 5 0 1 2 1 2 0 0 예제 출력 1 2 7 3 5 4 1 8 6 풀이 이 문제는 세그먼트 트리와 파라매트릭 바이너리 서치를 이용한 문제이다. 원래 수열을 구하려면 맨 앞에서부터 하나하나 찾는 방법으로 원래 수열을 구할 수 있다. 우선 길이..
BOJ 1071 소트 문제 N개의 정수가 주어지면, 이것을 연속된 두 수가 연속된 값이 아니게 정렬(A[i] + 1 ≠ A[i+1])하는 프로그램을 작성하시오. 가능한 것이 여러 가지라면 사전순으로 가장 앞서는 것을 출력한다. 입력 첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 N개의 수가 주어진다. N개의 수는 1,000보다 작거나 같은 자연수 또는 0이다. 출력 첫째 줄에 문제의 정답을 출력한다. 예제 입력 1 3 1 2 3 예제 출력 1 1 3 2 예제 입력 2 9 1 1 1 1 2 2 2 2 2 예제 출력 2 2 2 2 2 2 1 1 1 1 풀이 이 문제는 재귀함수를 사용해 쉽게 풀 수 있다. 우선 N개 수 중 P개의 수를 배열했다고 할 때, 나머지를 배열하는 방법은 P+1번째 수에 쓸..

728x90