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

의식의 흐름
양 끝 개발자를 투 포인터가 가리키게 하면 될 것 같은데... 포인터 이동하는 조건을 어떻게 둬야하지..?
(결국 풀이 참고함) start와 end를 양 끝에서 시작해서 점차 가까워지도록 하면 되는거였는데 두 포인터를 앞에 두고 시작하는 방법만 생각했댱,,,
풀이 과정
1. 개발자 수(N)를 입력받는다.
2. N개의 개발자 능력치를 배열(ability)에 담아둔다.
3. 포인터를 이동하면서 최대 능력치(maxAbility)를 갱신한다.
3-1) start, end 포인터가 배열(ability)의 양 끝을 가리키게 둔다.
3-2) ability[start]와 ability[end]의 대소관계에 따라 포인터를 이동한다.
ability[start] < ability[end]인 경우, start 포인터를 오른쪽으로 이동시킨다.
ability[start] >= ability[end]인 경우, end 포인터를 왼쪽으로 이동시킨다.
start 포인터와 end 포인터가 서로 가까워지기 때문에 '개발자 A와 개발자 B 사이에 존재하는 다른 개발자 수'는 계속해서 감소한다. 따라서 'min(개발자 A의 능력치, 개발자 B의 능력치)'을 증가시키는 것에 초점을 두어야 한다.
4. maxAbility를 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int[] ability;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
ability = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
ability[i] = Integer.parseInt(st.nextToken());
}
int start = 0;
int end = N-1;
int maxAbility = 0;
while(start<end){
maxAbility = Math.max(maxAbility, (end-start-1)*Math.min(ability[start],ability[end]));
if(ability[start] < ability[end]){
start++;
}
else{
end--;
}
}
bw.write(Integer.toString(maxAbility));
bw.flush();
br.close();
bw.close();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
---|---|
[JAVA] 백준 q16926 - 배열 돌리기 1 (0) | 2023.11.21 |
[JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.11.20 |
[JAVA] 백준 q20922 - 겹치는 건 싫어 (2) | 2023.10.30 |
백준 q14567 - 선수과목 (Prerequisite) (0) | 2023.10.27 |
22945번: 팀 빌딩
개발자 $N$명이 팀 빌딩을 위해 한 줄로 서있다. 하나의 팀을 만들기 위해서는 개발자 2명이 반드시 모여야 한다. 개발자 A와 개발자 B가 팀을 만들 때 팀의 능력치는 아래와 같이 계산이 된다. (개
www.acmicpc.net

의식의 흐름
양 끝 개발자를 투 포인터가 가리키게 하면 될 것 같은데... 포인터 이동하는 조건을 어떻게 둬야하지..?
(결국 풀이 참고함) start와 end를 양 끝에서 시작해서 점차 가까워지도록 하면 되는거였는데 두 포인터를 앞에 두고 시작하는 방법만 생각했댱,,,
풀이 과정
1. 개발자 수(N)를 입력받는다.
2. N개의 개발자 능력치를 배열(ability)에 담아둔다.
3. 포인터를 이동하면서 최대 능력치(maxAbility)를 갱신한다.
3-1) start, end 포인터가 배열(ability)의 양 끝을 가리키게 둔다.
3-2) ability[start]와 ability[end]의 대소관계에 따라 포인터를 이동한다.
ability[start] < ability[end]인 경우, start 포인터를 오른쪽으로 이동시킨다.
ability[start] >= ability[end]인 경우, end 포인터를 왼쪽으로 이동시킨다.
start 포인터와 end 포인터가 서로 가까워지기 때문에 '개발자 A와 개발자 B 사이에 존재하는 다른 개발자 수'는 계속해서 감소한다. 따라서 'min(개발자 A의 능력치, 개발자 B의 능력치)'을 증가시키는 것에 초점을 두어야 한다.
4. maxAbility를 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int[] ability;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
ability = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
ability[i] = Integer.parseInt(st.nextToken());
}
int start = 0;
int end = N-1;
int maxAbility = 0;
while(start<end){
maxAbility = Math.max(maxAbility, (end-start-1)*Math.min(ability[start],ability[end]));
if(ability[start] < ability[end]){
start++;
}
else{
end--;
}
}
bw.write(Integer.toString(maxAbility));
bw.flush();
br.close();
bw.close();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
---|---|
[JAVA] 백준 q16926 - 배열 돌리기 1 (0) | 2023.11.21 |
[JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.11.20 |
[JAVA] 백준 q20922 - 겹치는 건 싫어 (2) | 2023.10.30 |
백준 q14567 - 선수과목 (Prerequisite) (0) | 2023.10.27 |