(백준) 점심메뉴 _ 12099

2021. 12. 29. 13:23·알고리즘/백준

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

 

🐢 설명

lower bound, upper bound를 사용해서 풀면 되는 문제이다.

 

  1. 주어진 음식 메뉴를 매운 순서로 정렬하고, 먹을 수 있는 범위인 u, v를 가지고 lower bound, upper bound를 구해준다.
  2. 이 범위내에서 먹을 수 있는 달달한 메뉴를 찾아야 하므로 반복문을 통해 x, y 범위 비교해준다.
  3. 2번에서 카운트한 개수가 곧 매운맛과 달달함이 충족된 메뉴의 개수이다.

총 Q번의 범위에 대해 N개의 메뉴들에 대해 이분탐색을 하고, 해당 범위 내에서 다시 탐색을 하게 된다. 따라서 대략 O(QN)의 시간 복잡도를 갖게 된다.

 

🐢코드
public class 점심메뉴_12099 {
    static int N;
    static int Q;
    static Menu[] menus;
    static StringBuilder answer = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        Q = Integer.parseInt(st.nextToken());
        menus = new Menu[N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int spicy = Integer.parseInt(st.nextToken());
            int sweet = Integer.parseInt(st.nextToken());
            menus[i] = new Menu(spicy, sweet);
        }

        Arrays.sort(menus, Comparator.comparing(m -> m.spicy));
        for (int i = 0; i < Q; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            findMenuCount(u, v, x, y);
        }
        System.out.print(answer);
    }

    private static void findMenuCount(int u, int v, int x, int y) {
        int[] bound = spicyMenuFind(u, v);
        int count = 0;

        for (int i = bound[0]; i < bound[1]; i++) {
            if (menus[i].sweet <= y && menus[i].sweet >= x) {
                count++;
            }
        }

        answer.append(count).append("\n");
    }

    private static int[] spicyMenuFind(int u, int v) {
        int start, end;
        int left = 0;
        int right = N;
        int mid;

        // lower bound
        while (left < right) {
            mid = (left + right) / 2;

            if (menus[mid].spicy < u)
                left = mid + 1;
            else
                right = mid;
        }
        start = right;

        left = start;
        right = N;
        // upper bound
        while (left < right) {
            mid = (left + right) / 2;

            if (menus[mid].spicy <= v)
                left = mid + 1;
            else
                right = mid;
        }
        end = right;

        return new int[]{start, end};
    }

    private static class Menu {
        int spicy;
        int sweet;

        public Menu(int spicy, int sweet) {
            this.spicy = spicy;
            this.sweet = sweet;
        }
    }
}
🐢 마무리
반응형
저작자표시 비영리 변경금지 (새창열림)

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

(백준) 달리기_2517  (0) 2022.02.02
(백준) 강수량 _ 2094  (0) 2022.02.02
(백준) 제기차기 _ 23830  (1) 2021.12.28
(백준) 인문예술탐사주간 _ 23829  (0) 2021.12.28
(백준) 넴모넴모 2020 _ 19845  (0) 2021.12.26
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 달리기_2517
  • (백준) 강수량 _ 2094
  • (백준) 제기차기 _ 23830
  • (백준) 인문예술탐사주간 _ 23829
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (289) N
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (5) N
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    키보드 손목 받침대
    마우스 패드
    레이저
    mx master s3 for mac
    류블라냐
    마우스
    동유럽
    부다페스트
    크로아티아
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 점심메뉴 _ 12099
상단으로

티스토리툴바