Stay Hungry Stay Foolish

SWEA

[SWEA] 5789. 현주의 상자 바꾸기 (Python/D3)

dev스카이 2024. 11. 13. 21:03

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


풀이 방법.

  • 상자 리스트 초기화
    • 각 테스트 케이스마다 크기가 N인 리스트 box를 0으로 초기화하여 만든다. 이 리스트는 각 구간의 값을 저장하는 역할을 한다.
  • 구간에 값 할당
    • Q개의 구간 입력을 반복해서 처리한다.
    • 각 구간에 대해 L부터 R까지 반복문을 돌며, 현재 구간 번호 i 로 리스트의 해당 구간 요소들을 업데이트한다.
  • 결과 출력
    • 리스트 box의 값들을 문자열로 변환해 공백으로 구분하여 출력한다.

Solution

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    N, Q = map(int, input().split())
    box = [0]*N  # 박스 리스트 생성 후 모두 0으로 초기화
    for i in range(1, Q + 1):
        L, R = map(int, input().split())
        for l in range(L - 1, R):
            box[l] = i
 
    print(f"#{test_case} {' '.join(map(str, box))}")

 

 

개선할 점

해당 코드에서 효율성 측면에서 크게 개선할 여지는 없다. 지금 작성된 코드의 로직은 테스트 케이스마다 box 리스트를 미리 초기화하고, 각 구간을 반복하면서 값들을 할당하는 방식으로 필요한 작업을 효율적으로 수행하고 있다.

하지만, 리스트 할당 범위를 조금 줄이는 방법 정도는 고려해볼 수 있다. 하지만 O(N * Q) 복잡도는 본질적으로 바뀌지 않으므로, 코드 최적화의 이점은 크지 않을 수 있다.

  • box[l:R] 슬라이싱 할당 사용 : for문 대신 슬라이싱 할당을 사용해 구간을 할당할 수 있다.

 

개선된 코드

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    N, Q = map(int, input().split())
    box = [0] * N
    for i in range(1, Q + 1):
        L, R = map(int, input().split())
        box[L - 1:R] = [i] * (R - L + 1)

    print(f"#{test_case} {' '.join(map(str, box))}")