

1. 문제 풀이 아이디어
- 양 끝에서부터 두 포인터를 사용하면 문제를 효율적으로 해결할 수 있다.
- 두 포인터가 가리키는 값의 합이
c
이하라면, 두 양동이는 한 번에 운반하는 것으로 처리하고 두 포인터를 각각 옮긴다.
2. 나의 정답 코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int n = Integer.parseInt(stringTokenizer.nextToken());
int c = Integer.parseInt(stringTokenizer.nextToken());
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(Integer.parseInt(stringTokenizer.nextToken()));
}
list.sort(Comparator.naturalOrder());
int s = 0, e = list.size() - 1;
int result = 0;
while (s <= e) {
if (list.get(s) + list.get(e) <= c) {
s++;
}
result++;
e--;
}
System.out.println(result);
bufferedReader.close();
}
}
3. 정리
- 입력된 양동이 무게를
list
에 저장한 뒤, 오름차순으로 정렬한다.
- 두 포인터
s
와e
를 각각 리스트의 시작과 끝으로 설정한다.
e
가s
보다 크거나 같을 동안while
문을 순회한다.
- 두 포인터가 가리키는 값의 합이
c
이하라면s
를 증가시킨다.
- 결과값을 증가시키고,
e
를 감소시킨다.
- 이 과정을 반복하여 필요한 자원봉사자 수를 계산하고 출력한다.
Share article