Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | 
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | 
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | 
| 26 | 27 | 28 | 29 | 30 | 31 | 
                            Tags
                            
                        
                          
                          - SQL
- level 3
- Java
- javascript
- Lv. 2
- Lv. 1
- 티스토리챌린지
- 파이썬
- join
- 백준
- 자바스크립트
- Lv. 3
- dfs
- Dynamic Programming
- 프로그래머스
- bfs
- Lv. 0
- 너비 우선 탐색
- Python
- SQL 고득점 KIT
- softeer
- programmers
- LEVEL 2
- 깊이 우선 탐색
- 소프티어
- 동적계획법
- 오블완
- Baekjoon
- group by
- DP
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 3] 선입 선출 스케줄링 {언어 : Python} [다시 풀어 보기] 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12920?language=python3#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
def solution(n, cores):
    answer = 0
    lenC = len(cores)
    
    # 코어의 개수보다 작업의 수가 적거나 같으면 바로 답을 구할 수 있음
    if n <= lenC:
        answer = n
    else:
        n -= lenC  # 초기 작업 수에서 코어 수를 뺌
        minTime = min(cores)
        maxTime = max(cores) * n
        
        # 이진 탐색을 이용하여 작업을 완료하는 데 필요한 최소 시간을 찾음
        while minTime < maxTime:
            midTime = (minTime + maxTime) // 2
            throughput = 0
            for core in cores:
                throughput += midTime // core
            if throughput >= n:
                maxTime = midTime
            else:
                minTime = midTime + 1
        
        # 찾은 최소 시간에서 남은 작업 수를 계산
        for core in cores:
            n -= (maxTime - 1) // core
        
        # 마지막 작업을 처리하는 코어를 찾음
        for i in range(lenC):
            if maxTime % cores[i] == 0:
                n -= 1
                if n == 0:
                    answer = i + 1
                    break
    
    return answer풀이 방법
- 먼저, 코어의 개수(lenC)와 처리해야 할 작업의 수(n)를 비교하여, 만약 n이 코어의 개수보다 작거나 같다면 바로 답을 구할 수 있다. 이 경우 n번째 코어가 마지막 작업을 처리하게 된다.
- 그렇지 않은 경우, 이진 탐색을 사용하여 작업을 완료하는 데 필요한 최소 시간을 찾는다.
- 최소 시간을 찾은 후, 각 코어가 maxTime에서 작업을 완료할 때까지의 남은 작업 수를 계산한다.
- 마지막으로, 어느 코어가 maxTime에 작업을 처리하게 되는지 찾아 해당 코어의 인덱스를 반환한다.
느낀점
- heap으로 풀어봤는데 효율성에서 15/30 점을 받았다.
- 이게 이분 탐색으로 푸는 문제라니... 다시 풀어서 외우는 것이 좋겠다.
728x90
    
    
  '알고리즘 > 다시 풀어 보기' 카테고리의 다른 글
| 백준 GOLD 5 [2504번] 괄호의 값 {언어 : Python} [다시 풀어 보기] (0) | 2024.08.05 | 
|---|---|
| 프로그래머스 [Lv. 3] 블록 이동하기 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.08.05 | 
| 프로그래머스 [Lv. 3] 등산코스 정하기 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.08.01 | 
| 프로그래머스 [Lv. 3] N으로 표현 {언어 : Python} [다시 풀어 보기] (0) | 2024.07.31 | 
| 프로그래머스 [Lv. 3] 표현 가능한 이진트리 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.07.30 |