문제 링크: https://www.acmicpc.net/problem/22945

 

22945번: 팀 빌딩

능력치가 다 다른 개발자 $N$명이 팀 빌딩을 위해 한 줄로 서있다. 하나의 팀을 만들기 위해서는 개발자 2명이 반드시 모여야 한다. 개발자 A와 개발자 B가 팀을 만들 때 팀의 능력치는 아래와 같

www.acmicpc.net

▶문제

능력치가 다 다른 개발자 N명이 팀 빌딩을 위해 한 줄로 서있다.

하나의 팀을 만들기 위해서는 개발자 2명이 반드시 모여야 한다.

개발자 A와 개발자 B가 팀을 만들 때 팀의 능력치는 아래와 같이 계산이 된다.

  • (개발자 A와 개발자 B 사이에 존재하는 다른 개발자 수) × min(개발자 A의 능력치, 개발자 B의 능력치)

예를 들어, 4명의 개발자가 존재할 때, 각 개발자의 능력치를 1 4 2 5라고 하자. 이때 능력치가 1인 개발자와 능력치가 5인 개발자가 한 팀을 이뤘다고 가정하자. 그러면 이 팀의 능력치는 2×min(1,5)=2가 된다.

팀 빌딩에서 나올 수 있는 팀 중 능력치의 최댓값을 구해보자.


▶입력

첫 번째 줄에 개발자의 수 N이 주어진다.

두 번째 줄에는 N의 개발자의 각 능력치 xi가 공백으로 구분되어 주어진다.


▶출력

팀의 능력치 최댓값을 출력한다.


▶해설

N의 최대 입력값이 100,000이므로 브루트 포스로는 시간 초과가 발생합니다. 투 포인터를 이용하여 풉니다.

 

변수 설정

int [] arr = new int[n+1]

int left = 1  // 왼쪽 시작 지점

int right = n // 오른쪽 시작 지점

 

만약 arr[left], arr[right]의 경우 팀 빌딩의 값은 (right-left-1)*Math.min(arr[left], arr[right])가 됩니다. 

 

이때 둘 중에 큰 값을 가리키는 포인터를 이동시켜도 최솟값은 변하지 않으므로 오히려 팀 빌딩 값이 작아집니다.

 

따라서 arr[left], arr[right] 중 작은 값을 가지는 포인터를 이동시키며, 진행했을 때 최댓값을 구할 수 있습니다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n;
static int [] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int [n+1];
String[] str = br.readLine().split(" ");
for(int i=1; i<=n; i++){
arr[i] = Integer.parseInt(str[i-1]);
}
int result = solve();
System.out.println(result);
}
private static int solve(){
int left = 1;
int right = n;
int result=0;
while (left<=right){
int min = Math.min(arr[left],arr[right]);
result = Math.max(min*(right-left-1), result);
if(arr[left]<arr[right]){
left++;
}
else{
right--;
}
}
return result;
}
}

지금까지 투 포인터 문제들은 항상 같은 지점에서 시작하는 방식이었는데, 이 문제는 시작 지점이 달라서 새로운 유형이었습니다.