Algorithm/문제 풀이

[Python][BoJ] 지정좌석 배치하기 1

jihuSunbae 2024. 12. 3. 10:55

목차

    🫡 Overview

    체감 난이도: 

    소요시간:  35분

    문제 레벨: 실버4 / 문제 유형: 단순 구현
    풀이 상태:  스스로 해결
    추후: 완벽 이해

     


    문제 링크

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

    문제 해석 

    더보기
    문제: 모든 학생들의 시야가 확보되도록 좌석 배치할 수 있는지 여부를 판단하기("YES" or "NO")
    - 앞 좌석 (좌석 높이+ 키) < 나의 (좌석 높이+키)
    <좌석 배치>
    - N행 M열의 좌석이 있음.
    
    <행 높이>
    - 높이가 D부터 시작
    - i(1,,,N) -> 높이가 D*i

    나의 코드

    행단위로 오름차순 정렬을 한 뒤, 문제 조건에 맞는지 체크한다. 

    - 문제 조건: 모든 학생에 대해서 같은 열의 앞 행 학생보다 키가 커야 된다. 

    더보기
    # 입력 받기
    N, M, D  = list(map(int, input().split()))
    
    h = [[-1]*(M+1)] # # N이랑 M이 1부터 시작할 수 있게 한다.
    for _ in range(N):
        h.append([-1]+list(map(int, input().split())))
    
    def accumulate(h, D): # 높이 더해주기
        for i in range(1,N+1):
            for j in range(1,M+1):
                h[i][j] += i*D
        return h
    
    def sort_by_row(h):
        # 행 단위로 오름차순 정렬하기
        for i in range(1, N + 1):
            h[i].sort()
        return h
    
    def available(h):
        # 각 열 단위로 앞 행의 모든 원소들이 나보다 작은지 체크하기
        for j in range(1, M + 1):
            for i in range(1, N):
                if h[i][j] >= h[i+1][j]: # (i-1) 번째 행이
                    return False
        return True
    
    # print('\n'.join(map(str, h)))
    h = accumulate(h, D)
    h = sort_by_row(h)
    result = available(h)
    
    if result:
        print("YES")
    else:
        print("NO")

     

     


    배운 점/느낀 점

    문제 티어 안보고 진짜 코딩 테스트라고 생각하고 풀었더니, 체감 난이도가 올라가는 것 같다. 

    앞으로 티어 안보고 풀어보는 연습을 해야겠다.