[프로그래머스 / Java] 입국심사

2024. 11. 25. 08:19·CodingTest/Sorting & Thinking

1. 문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제 요약]

  • 모든 사람이 심사를 받는데 걸리는 시간의 최솟값 구하기
  • 숫자의 범위가 크다

 

2. 생각대로 풀기

숫자의 범위가 크다 -> 이분 탐색

 

(코드 설명 주석은 AI 활용)

import java.util.Arrays;
class Solution {
   public long solution(int n, int[] times) {
       // n: 입국심사를 기다리는 사람 수
       // times: 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열
       
       // 심사 시간을 오름차순으로 정렬
       Arrays.sort(times);
       
       // 이진 탐색을 위한 범위 설정
       long left = 1;                               // 최소 소요시간
       long right = (long) times[times.length-1]*n; // 최대 소요시간 (가장 긴 심사시간 * 인원수)
       long answer = right;                         // 답을 저장할 변수 (최댓값으로 초기화)
       
       // 이진 탐색 수행
       while (left <= right) {
           long mid = (left + right) / 2;           // 중간값 계산 (현재 검사할 시간)
           
           // mid 시간 동안 n명 이상을 처리할 수 있는지 확인
           if (can(n, times, mid)) {
               answer = mid;                        // 가능하다면 현재 시간을 정답 후보로 저장
               right = mid - 1;                     // 더 작은 시간에서 가능한지 탐색
           } else {
               left = mid + 1;                      // 불가능하다면 더 큰 시간 탐색
           }
       }
       return answer;                              // 찾은 최소 시간 반환
   }
   
   /**
    * 주어진 시간(checkTime) 내에 모든 사람을 심사할 수 있는지 확인하는 메서드
    * @param n 심사해야 할 사람의 수
    * @param times 각 심사관별 심사 시간 배열
    * @param checkTime 검사할 총 소요 시간
    * @return 모든 사람을 심사할 수 있으면 true, 없으면 false
    */
   private boolean can(int n, int[] times, long checkTime) {
       long sum = 0;                               // 심사 가능한 총 인원수
       for (int t : times) {
           sum += checkTime / t;                   // 각 심사관이 checkTime 동안 심사 가능한 인원 누적
           // 심사 가능 인원이 n 이상이면 즉시 true 반환 (최적화)
           if (sum >= n) return true;  
       }
       return sum >= n;                           // 최종적으로 심사 가능 인원이 n 이상인지 확인
   }
}
저작자표시 (새창열림)
'CodingTest/Sorting & Thinking' 카테고리의 다른 글
  • [프로그래머스 / Java] 징검다리 건너기
마볼링
마볼링
개발과 게임에 관한 내용을 읽기 쉽게 정리합니다.
  • 마볼링
    게임을 좋아하는 개발자의 블로그
    마볼링
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Project
        • LOATODO
        • 인스타그램 클론코딩(중단)
      • Language
        • Java
        • PHP
        • Javascript
      • Framework & Library
        • Spring
        • Vue
      • Computer Science
        • Web
        • Linux
      • CodingTest
        • Algorithm
        • Kotlin으로 푼 코딩 테스트
        • Java로 푼 코딩 테스트
        • Sorting & Thinking
        • BFS
      • 책&강의 정리
      • 정보처리기사
      • 개인
        • 팰월드(PALWORLD)
        • 마인크래프트
  • 블로그 메뉴

    • 링크

      • GitHub
      • Threads
    • 공지사항

    • 인기 글

    • 태그

      LoaTodo
      CS
      프로그래머스
      Database
      error
      코딩테스트
      java
      php
      jsp
      운영체제
      이터널 모드
      오블완
      JPA
      로아투두
      티스토리챌린지
      springboot
      네트워크
      아크 서바이벌
      Spring
      codingtest
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.1
    마볼링
    [프로그래머스 / Java] 입국심사
    상단으로

    티스토리툴바