[Two Pointer] 먹을 것인가 먹힐 것인가

김우진·2022년 7월 22일
0

알고리즘 문제

목록 보기
10/21
post-thumbnail

먹을 것인가 먹힐 것인가

문제 정보

  • 사이트 : 백준 알고리즘 사이트
  • 문제 번호 : 7795
  • 문제 분류 : Two Pointer
  • 난이도 : silver 3

문제 풀이

내가 짠 코드

  • A가 B보다 큰 경우만 먹을 수 있으므로 A는 내림차순, B는 오름차순으로 정렬하여 반복문을 진행하였다.
  • 만약 A중에서 B를 먹을 수 없는 경우가 나오면 그 뒤의 A는 해당 B를 먹을 수 없을 것이다(내림차순이므로)
  • 이를 이용해 eat이라는 boolean 배열을 생성해 먹을 수 없는 B가 나오는 지점을 false로 바꿔 먹을 수 없다고 표시하여 반복하는 횟수를 줄였다.
public class BoJ7795 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        while(T-- > 0){
            String[] input = br.readLine().split(" ");
            int n = Integer.parseInt(input[0]);
            int m = Integer.parseInt(input[1]);
            Integer[] arrA = new Integer[n];
            int[] arrB = new int[m];
            boolean[] eat = new boolean[m];
            input = br.readLine().split(" ");
            for (int i = 0; i < n; i++) {
                arrA[i] = Integer.parseInt(input[i]);
            }
            input = br.readLine().split(" ");
            for (int i = 0; i < m; i++) {
                arrB[i] = Integer.parseInt(input[i]);
            }

            Arrays.sort(arrB);
            Arrays.sort(arrA, Collections.reverseOrder());
            Arrays.fill(eat, true);

            int count = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if(!eat[j])
                        break;
                    if(arrA[i] > arrB[j])
                        count++;
                    else {
                        eat[j] = false;
                        break;
                    }
                }
            }
            System.out.println(count);
        }
        br.close();
    }
}

문제 출처

썸네일 출처

Image by storyset on Freepik

0개의 댓글