[랜덤 마라톤] Feeding Seals(17799)

lhs's avatar
Dec 08, 2024
[랜덤 마라톤] Feeding Seals(17799)
notion image
notion image

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에 저장한 뒤, 오름차순으로 정렬한다.
  • 두 포인터 se를 각각 리스트의 시작과 끝으로 설정한다.
  • es보다 크거나 같을 동안 while문을 순회한다.
  • 두 포인터가 가리키는 값의 합이 c 이하라면 s를 증가시킨다.
  • 결과값을 증가시키고, e를 감소시킨다.
  • 이 과정을 반복하여 필요한 자원봉사자 수를 계산하고 출력한다.
Share article

LHS's Study Space