본문 바로가기
코딩테스트 파이썬/백준

새 앨범 ( 1424 번 )

by 세용용용용 2025. 9. 29.

1424번: 새 앨범

 


🧠 알고리즘

  • 그리디(탐욕적) 기반 시뮬레이션
  • 음반에 담을 수 있는 최대 곡 수를 계산하고, 제약 조건(13의 배수 금지)을 적용하며 반복적으로 음반을 채움

 

✔️ 동작 방식

  • 최대 수록 곡 수 계산 >> 공식: count(L + 1) <= (C + 1) 에서 도출 → (C + 1) // (L + 1)
  • 반복 처리 >> 단, 마지막 남은 곡이 13의 배수일 경우 → 현재 음반에서 한 곡 빼고 조정
  • 음반 카운트 증가 & 곡 수 차감
  • 정답 출력

 

🧾 코드

import sys

# 13으로 나누어 떨어질경우 -1 뺴기
def _na_13_check(number):
    return number if (number % 13) != 0 else number - 1
    
def _main(N, L, C):
    answer = 0
    """
        저장 할수 있는 노래 최댓값
        count * L + count - 1 <= C
        count * L + count <= (C + 1)
        count(L + 1) <= (C + 1)
        즉, count <= (C + 1) // (L + 1)
    """
    max_count = (C + 1) // (L + 1)
    max_count = _na_13_check(max_count)

    # 모든 노래 수록 할 떄 까지 계속 진행
    while N:
        music_lenth = min(N, max_count)
        music_lenth = _na_13_check(music_lenth)

        """
            [ 중요!! ] 
            다음 노래가 마지막인데 13으로 나누어 떨어질 경우..
            현재 노래에서 한 곡 뺴서 마지막 곡 주기!!
            21 21 12 1 << No!! No!!
            21 20 14 << Good!! Good!!            
        """
        next_n = N - music_lenth
        if (next_n > 0) and (next_n < max_count) and (next_n % 13 == 0):
            music_lenth = _na_13_check(music_lenth - 1)

        # 최종 음반 래핑
        answer += 1
        N -= music_lenth

    return answer


N = int(sys.stdin.readline().rstrip())
L = int(sys.stdin.readline().rstrip())
C = int(sys.stdin.readline().rstrip())

print(_main(N, L, C))

 

⏱️ 시간 복잡도

while N : 모든 곡 수록 시 까지 반복 ( 선형 시간 복잡도 )

해당 알고리즘 시간 복잡도 : 선형 시간 복잡도 ( O(n) )

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

공항 ( 10775 번 )  (3) 2025.10.01
숌 사이 수열 ( 1469 번 )  (0) 2025.10.01
되돌리기 ( 1360 번 )  (1) 2025.09.22
농장 관리 ( 1245 번 )  (0) 2025.09.13
머리 톡톡 ( 1241 번 )  (0) 2025.09.13