ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 1931 : 회의실 배정
    코딩테스트/백준 2024. 9. 24. 08:05

    요구사항

    1. 1개의 회의실에 N개의 회의가 있을 때, 회의실을 사용할 수 있는 최대 개수를 출력
    2. 회의가 끝남과 동시에 시작할 수 있다.

    설계

    1. 끝나는 시간 순서대로 오름차순 정렬하고 만약 끝나는 시간이 같다면 시작 시간으로 오름차순 정렬한다.
    2. 만약에 끝나는 시간과 그 다음 시작 시간이 같다면 count += 1 해준다.
    3. 같지 않다면 그 다음 시간과 비교해준다. 

    파이썬 문법 배우기

    sort_meetings = sorted(meetings lambda: x [meetings[1], meetings[0]])
    • 인자를 받아 끝나는 시간과 시작하는 시간으로 오름차순 정렬 하고 싶었던 의도다. 
    • 하지만 위 경우 sorted() 함수의 key 라는 인자를 받아 정렬하지만 빠져있다. 
    sort_meetings = sorted(meetings, key = lambda x : (x[1], x[0]))
    • 왜인지 모르겠지만 위 소스 코드처럼 정렬을 했을 때, 끝나는 시간이 앞에 올 거 같은 착각을 불러 일으키지만, 그렇지 않다. 

    구현

    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    N = int(input())
    meetings = [list(map(int, input().split())) for _ in range(N)]
    
    sorted_meetings = sorted(meetings, key=lambda x: (x[1], x[0]))
    
    # 회의 선택 카운트 및 마지막으로 선택된 회의의 종료 시간
    count = 0
    last_end_time = 0
    
    for meeting in sorted_meetings:
        start, end = meeting
        if start >= last_end_time:
            count += 1
            last_end_time = end
    
    print(count)

     

     

    2024.10.01 다시 풀어보기

    def find_max(meettings):
        meettings = sorted(meettings, key=lambda x: (x[1],x[0]))
        end_time = 0
        count = 0
    
        for start, end in meettings:
            if start >=0:
                count += 1
                end_time = end
        
        return count
    
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    N = int(input())
    meettings = [list(map(int, input().split()) for _ in range(N))]
    
    print(find_max(meettings))
    • ValueError : too many values to unpack (expected 2)
    • 본래 의도는 meettings를 순회하면서 각 원소들의 시작 시간과 종료 시간을 받아오는 것이였다.
    • 하지만 start, end 인자값으로 meettings 리스트 그 자체가 들어가서 생긴 오류이다. (++아래 추가 설명 있습니다.)
    • 그래도 같은 오류가 발생
    # 입력
    N = int(input())
    meettings = [list(map(int, input().split()) for _ in range(N))]
    
    #print(find_max(meettings))
    print(meettings)
    
    # 출력
    [[<map object at 0x00000247E58EB970>, <map object at 0x00000247E58EB910>, <map object at 0x00000247E58EB8B0>, <map object at 0x00000247E58EB850>, <map object at 0x00000247E58EB7F0>, <map object at 0x00000247E58EB790>, <map object at 0x00000247E58EB700>, <map object at 0x00000247E58EB670>, <map object at 0x00000247E58EB5E0>, <map object at 0x00000247E58EB550>, <map object at 0x00000247E58EB4C0>]]
    • 현재 meettings 리스트가 map 주소값을 리턴하고 있다. 
    • 괄호의 위치가 잘못 되었다. 
    meettings = [list(map(int, input().split())) for _ in range(N)]
    • 위 소스 코드로 바꾸어 원하는 의도 맞게 올바르게 출력하고 있지만, count 값이 11을 리턴한다.
    • 그 이유는 if start >=0 클 때, 여서 그런 듯 하다. start >= end_time 으로 바꾸어 주면 될 거 같다.

    최종 소스 코드

    def find_max(meettings):
        meettings = sorted(meettings, key=lambda x: (x[1],x[0]))
        end_time = 0
        count = 0
    
        for meetting in meettings:
            start, end = meetting
    
            if start >=end_time:
                count += 1
                end_time = end
        
        return count
    
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    N = int(input())
    meettings = [list(map(int, input().split())) for _ in range(N)]
    
    print(find_max(meettings))

     

    + 추가로

    def find_max(meettings):
        meettings = sorted(meettings, key=lambda x: (x[1],x[0]))
        end_time = 0
        count = 0
    
        for start, end in meettings:
            if start >=end_time:
                count += 1
                end_time = end
        
        return count
    
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    N = int(input())
    meettings = [list(map(int, input().split())) for _ in range(N)]
    
    print(find_max(meettings))
    • 처음 ValueError 원인이 start, end 값을 2개 기대 했는 데 그 이상이라 오류가 났다고 생각했었다.
    • 그래서 다시 한 번 바꾸어서 시도해봤는 데 원하는 의도대로 결과가 출력이 된다.

    '코딩테스트 > 백준' 카테고리의 다른 글

    [Python] BOJ 13305 : 주유소  (1) 2024.09.24
    [Python] BOJ 1541 : 잃어버린 괄호  (0) 2024.09.24
    [Python] BOJ 1929 : 소수 구하기  (0) 2024.09.23
    [Python] BOJ 4134 : 다음 소수  (0) 2024.09.23
    [Python] BOJ 2485 : 가로수  (0) 2024.09.23
Designed by Tistory.