코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

7795번 : 먹을 것인가 먹힐 것인가

2022. 8. 31. 19:26

https://www.acmicpc.net/problem/7795

 

7795번: 먹을 것인가 먹힐 것인가

심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을

www.acmicpc.net

 

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());

        for(int i=0;i<t;i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int a[] = new int[n];
            int b[] = new int[m];

            //a입력
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<n;j++) {
                a[j] = Integer.parseInt(st.nextToken());
            }
            //b입력
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<m;j++) {
                b[j] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(b);
            int result = 0;

            for(int j=0;j<n;j++) {
                int start = 0, end = m - 1;
                int max=-1;
                while (start <= end) {
                    int mid = (start + end) / 2;

                    if (a[j]<=b[mid]) end=mid-1;
                    else if (a[j]>b[mid]){
                        if(max<mid) max=mid;
                        start=mid+1;
                    }
                }
                result+=(max+1);
            }
            bw.write(result + "\n");
        }
        bw.flush();
    }
}

 

 

해결방법

일단 배열 B를 정렬하고, 핵심은 배열 A의 값마다  배열 B의 값보다 큰 경우의 인덱스 중 가장 큰 값을 찾아 결괏값에 더해 주었다. 이를 수행할 때 이분 탐색을 사용하였다. 인덱스 중 가장 큰 값+1 은 곧 A가 B를 먹을 수 있는 쌍의 개수가 된다.

 

굳이 이분탐색을 쓰지 않고 배열 A도 정렬하여 뒤에서부터 비교하도록 반복문을 돌려도 답은 맞게 나온다. 코드도 간단해지고 성능도 좋아진다.

'알고리즘 > 백준' 카테고리의 다른 글

15903번 : 카드 합체 놀이  (0) 2022.09.07
1448번 : 삼각형 만들기  (0) 2022.09.07
2468번 : 안전 영역  (0) 2022.08.27
7562번 : 나이트의 이동  (0) 2022.08.25
4963번 : 섬의 개수  (0) 2022.08.23
    '알고리즘/백준' 카테고리의 다른 글
    • 15903번 : 카드 합체 놀이
    • 1448번 : 삼각형 만들기
    • 2468번 : 안전 영역
    • 7562번 : 나이트의 이동
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바