본문 바로가기
백준 풀이

[백준/BOJ] - 11497번 python 풀이 - 그리디

by 반오십 코린이 2023. 11. 1.
728x90

 


푸는데 고생좀 한 문제.

 

일단 주어진 배열을 오름차순으로 정렬한다.

[10,10,11,11,12,12,13] 이라고 정렬 됐을 때,

문제에서 원하는 배열을 가지기 위해서는

가장 큰 값을 가운데로 두고, 가장 작은 값부터 배열 외각에 위치시키는 것이 주 목적이다.

 

본인은 하나의 반복문안에 변수 2가지를 한번에 처리하려고 했다.

그 말은 즉, 정렬시킬 배열을 temp라고 가정하면,

temp의 앞, 뒤에 원하는 변수를 넣는 과정을 한번에 처리하려고 했다는 점.

 

1 사이클이 끝나면 

[10,0,0,0,0,0,10]

 

2 사이클이 끝나면

[10,11,0,0,0,11,10]

.

.

.

최종적으로

[10,11,12,13,12,11,10]

이 되게끔 해야함.

 

처음 반복문 변수를 통해 구현하려 했는데,

반복문 변수를 이용하는 것 보다 두가지 변수를 새로 만들어 구현하는 것이 더 깔끔하다는 것을 캐치.

 

arr을 위한 변수 i는 step을 2로 두었고, temp를 위한 변수 j는 step을 1로 두었다.

arr은 idx를 정직하게 2개씩 뛰어넘어야 하는 로직이고

temp는 배열의 앞, 뒤로 진행하기 때문에

 

arr에 사용하는 i와 동일한 변수를 사용하면 해결 불가능.

※ i는 0, 2 ... 이런식으로 증가하기에 

 

 

반복문에서 두가지의 변수가 필요하다는 점을 늦게나마 캐치해서 오래걸렸다.


import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
    n = int(input())
    arr = list(map(int,input().split()))
    arr.sort()    
    mini = -sys.maxsize
    temp = [0 for _ in range(n)]        
    i,j = 0,0

    for _ in range(n//2):        
        temp[j] = arr[i]
        temp[-(j+1)] = arr[i+1]
        i+=2
        j+=1
    if n%2 != 0:
        temp[n//2] = arr[-1]    

    for j in range(n):
        mini = max(mini,abs(temp[j] - temp[j-1]))
    print(mini)

고민의 흔적

 

 

728x90