알고리즘

[백준, 분할과 정복, 11582번] 치킨 TOP N

hminor 2023. 8. 10. 12:09

처음 접근해본 풀이 방법으로
분할과 정복 문제는 처음 배울때 재귀로 배웠어서 아래와 같이 접근했는데 
아직 알고리즘을 쉽게 푸는 방식에 대해 깨닫지 못했는지 코드도 길고 시간도 꽤나 걸렸다.

def CTP(li):
    global k, n
    if len(li) == 1: return li
    mid = len(li)//2
    left, right = CTP(li[:mid]), CTP(li[mid:])
    if k == n//mid: result.append(left+right)
    return sorted(left+right)


import sys
input = sys.stdin.readline
n = int(input())
li = list(map(int,input().split()))
k = int(input())
result = []
if k == n: print(*li)
elif k == 1: print(*sorted(li))    
else: 
    CTP(li)
    for i in result: print(*i, end=' ')

 

그래서 재귀로 말고 그냥 단순히 반복문을 활용해서 풀었는데 훨씬 쉬웠다.
반복문에서는 끝까지 찍고 오는 분할과 정복 과정에서
단순히 인원 수에 맞게 슬라이싱 하고 정렬하여 출력하는 식으로 풀었음.

import sys
input = sys.stdin.readline
n = int(input())
li = list(map(int,input().split()))
k = int(input())

idx = n//k
for i in range(0, n, idx): print(*sorted(li[i:i+idx]), end=' ')