맛있는물회

[맛있는물회] <SWEA알고리즘> 4843번 "특별한 정렬" 본문

IT/알고리즘

[맛있는물회] <SWEA알고리즘> 4843번 "특별한 정렬"

맛있는물회 2020. 4. 2. 08:25

문제 조건


보통의 정렬은 오름차순이나 내림차순으로 이루어지지만, 이번에는 특별한 정렬을 하려고 한다.

N개의 정수가 주어지면 가장 큰 수, 가장 작은 수, 2번째 큰 수, 2번째 작은 수 식으로 큰 수와 작은 수를 번갈아 정렬하는 방법이다.

예를 들어 1부터 10까지 10개의 숫자가 주어지면 다음과 같이 정렬한다.

10 1 9 2 8 3 7 4 6 5
 

주어진 숫자에 대해 특별한 정렬을 한 결과를 10개까지 출력하시오

 

Input


첫 줄에 테스트 케이스 개수 T가 주어진다.  1<=T<=50

다음 줄에 정수의 개수 N이 주어지고 다음 줄에 N개의 정수 ai가 주어진다. 10<=N<=100, 1<=ai<=100

 

Output


각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 특별히 정렬된 숫자를 10개까지 출력한다.

 

생각한 아이디어


이런 문제에서 파이썬의 힘이 크게 발휘되는 것 같다. C에서는 Array에서 값을 삭제하려면 Search를 거친 후 Index값을 찾고 해당하는 값을 삭제하려면 또 다시 새로운 Array에 복사를 하던가 그런 작업을 거쳐야한다.

하지만 파이썬에서는 아주 간단하게 Index를 입력하던, Value를 입력하던 알아서 찾아서 삭제가 가능하다!

Array.remove(value)를 하면 삭제가 가능하다.

이렇게 진행하면 아주 간단하게 문제가 풀린다.

먼저 젤 큰 값 넣고 삭제하고, 젤 작은 값 넣고 삭제하고 ... 반복하면 끝!

소스코드


T = int(input())
for TC in range(1, T+1):
    N = int(input())
    arr = list(map(int, input().split()))
    ans = list()
    while len(arr) > 0:
        top = max(arr)
        arr.remove(top)
        ans.append(top)

        bot = min(arr)
        arr.remove(bot)
        ans.append(bot)
    result = ' '.join(map(str,ans[0:10]))

    print("#%d" %TC,result)

 

*파이썬 문법 정리

- min(Array) max(Array)를 통하여 list에서 최대 최소 값을 아주 쉽게 찾아낼 수 있다. (return 값은 value이다)

- 출력할 때 고생했던 부분이다. List를 원소값들만 출력하려 하니 계속 , 콤마 와 [] 대괄호가 붙어서 출력이 안되었다. 이럴때 Join 연산으로 새로운 String을 만들어주어서 출력을 하니 성공했다.

result = ' '.join(map(str,ans[0:10]))

ans가 값이 있는 List일때 ans[0:10]의 값을 str으로 바꾸어서 ' ' 에 join 연산을 하여 result를 만들겠다는 이야기이다.

- 리스트에서는 Array[a:b] 로 자신이 원하는 범위를 지정해서 가지고 놀 수 있다.

Comments