문제 분류 수업 진도 대회 채점현황 순위 질문게시판
게임
스도쿠 타이핑 리듬 타자게임 타이핑 테트리스 타이핑 인베이더 타이핑 지뢰찾기 8192 공룡게임 타이핑 플래피버드 랭킹
로그인

6002 : 분할정복 — 배열 최대·최소

•시간제한: 2.000 S •메모리제한: 256 MB •제출: 0 •통과: 0 •만든사람: suakii

6002 : 분할정복 — 배열 최대·최소

시간 2.000s · 메모리 256MB · 제출 0 · 정답 0

문제 설명

크기가 $N$인 정수 배열이 주어질 때, 분할 정복(Divide and Conquer)으로 최댓값, 최솟값, 그리고 총 원소 비교 횟수를 구하는 프로그램을 작성하십시오.

[분할 정복 및 비교 규칙]

구간 $[l, r] 재귀적으로 탐색할 때 비교 횟수는 아래 표준 규칙을 따릅니다.

  • 크기 1 ( = r$): 비교 0회 (최댓값 = 최솟값 = $arr[l]$)
  • 크기 2 ( + 1 = r$): 두 원소를 1회 비교하여 큰 값과 작은 값을 결정
  • 크기 3 이상 ( + 2 \le r$): $mid = \lfloor (l + r) / 2 floor$ 기준으로 좌우 구간을 재귀 호출한 뒤, 병합 단계에서 최댓값끼리 1회 비교 + 최솟값끼리 1회 비교 (총 2회 추가)

[제약 조건]
• $N$: $1 \le N \le 100{,}000$ (정수)
• 배열 원소: $-10^9 \le a_i \le 10^9$ (정수)

입력 설명

첫째 줄에 배열의 크기 정수 $N$이 주어집니다.
둘째 줄에 공백으로 구분된 $N$개의 정수가 주어집니다.

[제약 조건]
• $1 \le N \le 100{,}000$
• 각 원소는 $-10^9$ 이상 $10^9$ 이하의 정수

출력 설명

배열의 최댓값, 최솟값, 그리고 알고리즘 수행 중 발생한 총 비교 연산 횟수를 공백으로 구분하여 한 줄에 출력합니다.

입력 예시
COPY
복사되었습니다!

5
3 1 4 1 5

출력 예시
COPY
복사되었습니다!

5 1 6

도움

재귀 함수 solve(l, r)을 구현할 때 구간 크기가 1이면 비교 0회, 크기가 2이면 비교 1회, 3 이상이면 $mid = (l+r)//2$로 분할하여 좌우 결과에 병합 비교 2회를 더합니다.

NOTICE  —  BFStudy OJ 정보샘
애들아, 문제 많이 풀고 게임 잠깐 하는거지?
— 정보샘