본문 바로가기

SW expert academy

4843. [파이썬 S/W 문제해결 기본] 2일차 - 특별한 정렬

출처

https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

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

swexpertacademy.com

 

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


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

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

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

10 1 9 2 8 3 7 4 6 5
 

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

 
 

[입력]
 

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

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

 

[출력]
 

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

 

입력

3
10
1 2 3 4 5 6 7 8 9 10
10
67 39 16 49 60 28 8 85 89 11
20
3 69 21 46 43 60 62 97 64 30 17 88 18 98 71 75 59 36 9 26

출력

#1 10 1 9 2 8 3 7 4 6 5
#2 89 8 85 11 67 16 60 28 49 39
#3 98 3 97 9 88 17 75 18 71 21

예전에 풀었던 문제인데 다시풀어봤다.

최대값, 최소값을 번갈아가며 정렬하는 문제이다

먼저 빈리스트를 선언해준뒤에 

입력받은 리스트의 최대값을 찾아 빈리스트에 추가해주고 마찬가지로 최소값을 찾은 후 최소값을 빈리스트에 추가한다.

그리고 추가된 최대값과 최소값을 원래 리스트에서 제거해준다.

while문에 배열의 길이가 true 면 값이 있는 것이기 때문에 조건을 len(arr)로 해주었다.

길이가 0 이면 알아서 while문이 종료된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
= int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    i = int(input())
    arr = list(map(int, input().split()))
 
    arr2 = [] #빈리스트 선언
 
    while len(arr): #arr에 값이 있을때 while문 반복
        a = max(arr) #arr의 최대값
        b = min(arr) #arr의 최소값
        arr2.append(str(a)) #빈 리스트에 최대값 추가
        arr2.append(str(b)) #빈 리스트에 최소값 추가
    
        arr.remove(a)
        arr.remove(b)
    print('#{}'.format(test_case),*arr2[:10]) #string형태로 받았기 때문에 슬라이싱 이용해서 출력.