coding test

[파이썬] 4843. 특별한 정렬

잔망루피 2021. 1. 8. 13:23

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

 

🛒 나의 풀이

 

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N=int(input())					# 정수의 개수
    ai=list(map(int, input().split()))			# N개의 정수
    max=sorted(ai, reverse=True)			# 내림차순 정렬
    min=sorted(ai)					# 오름차순 정렬
    length=len(ai)	
    result=list()
    i=0				# 인덱스
    
    while i != length//2 :			# 절반까지만 반복해야 중복이 없음.
        result.append(max[i])			# 큰 수 넣은 후 작은 수 넣기
        result.append(min[i])
        i+=1
    print('#%d' %test_case, end=' ')
    for i in result[:10]:    			# 최대 10개만 출력
    	 print(i, end=' ')
    print()

 

내가 자주하는 실수 : input받아오는 것. 꼭 모든 변수 선언 후 확인하자.. or 보고싶은 부분만 입력을 직접 주든지

result가 한 줄에 띄어쓰기로 구분되면서 쭉 나오도록 하려면 sep가 아니라 end를 ' '줘야 띄어쓰기가 되네.

아.. N이 있으니까 length=len(ai)할 필요없다(자주 이러네ㅠ)

입력받은 리스트 ai를 내림차순 정렬, 오름차순 정렬한 리스트를 생성한다.

큰 수, 작은 수 순서로 리스트 result에 추가했다.

 

👒 다른사람 풀이

 

TC = int(input())
for tc in range(1, TC+1):
    N = int(input())						# 정수의 개수	
    Data = list(map(int, input().split()))			# N개의 정수
    lst = [0]*N

    # Max 값 구하기
    for i in range(N//2):
        lst[i*2] = max(Data)			# 짝수 index에 max값
        Data.pop(Data.index(max(Data)))
	
    # Min 값 구하기
    for i in range(N//2):
        lst[i*2+1] = min(Data)			# 홀수 index에 min값
        Data.pop(Data.index(min(Data)))

    print('#%s'%tc, end=' ')
    for i in range(10):			# 최대 10개까지 출력
        print(lst[i], end=" ")
    print()

 

for문으로 Max와 Min값을 구한다. pop을 해가면서 n번째로 큰 수 or 작은 수를 구한다.

Max는 lst의 짝수 index에 값을 넣고 Min은 홀수 index에 값을 넣어서 최종 결과값인 lst를 만든다.

 

T = int(input())

for t_idx in range(1, T+1):
    N = int(input())		# 정수의 개수	
    numbers = list(map(int, input().split()))		# N개의 정수

    sort_list = []
    while numbers:
        max_num = max(numbers)
        min_num = min(numbers)
        
        sort_list.extend([str(max_num), str(min_num)])
        numbers.remove(max_num)
        numbers.remove(min_num)

    print(f"#{t_idx} {' '.join(sort_list[:10])}")

 

리스트 numbers의 max와 min을 구하고 sort_list에 확장한다. 나도 append 대신에 extend를 썼으면 더 좋았을텐데

값을 연달아 추가할 때는 append를 2번 쓰기보다는 extend를 사용해야겠다.

리스트 numbers에서 max_num과 min_num을 삭제하면서 null이 되기 전까지 반복한다. 

sort_list의 0부터 9까지의 값을 문자열로 변환해서 출력한다. ' '라서 값들이 공백으로 구분되어 출력된다.

출력부분도 잘 짰네. print문을 좀 더 효율적으로 활용할 수 있도록 공부를 해야겠다.

 

반응형

'coding test' 카테고리의 다른 글

[파이썬] 4861. 회문  (0) 2021.01.08
[파이썬] 4864. 문자열 비교  (0) 2021.01.08
[파이썬] 4839. 이진탐색  (0) 2021.01.07
[파이썬] 4837. 부분집합의 합  (0) 2021.01.06
[파이썬] 4836. 색칠하기  (0) 2021.01.06