코드 n = int(input()) lst = set() for _ in range(n): k = input() lst.add(k) lst = list(lst) lst.sort(key = lambda x: (len(x),x)) # 사전순 정렬은 x로 두면 된다. for i in lst: print(i) 사전순 정렬은 x로 두면 되는 걸 배운 문제
정렬
코드 lst = [] num = 0 while 1: if lst and num+1 == len(lst): break # 최초 값도 포함하기 때문에 리스트 길이가 1 길다. k = input().split() if not lst: num = int(k[0]) # break 값 설정 for i in k: lst.append(int(i[::-1])) # 뒤집은 값을 리스트에 추가 sortedlst = sorted(lst[1:]) # 처음 값은 빼주어야하므로 슬라이싱 for i in sortedlst: print(i)
코드 import sys input = sys.stdin.readline n,m = map(int, input().split()) sequence = [] # 메달 수 기록 for _ in range(n): sequence.append([*map(int, input().split())]) sequence.sort(key = lambda x: (-x[1], -x[2], -x[3])) # 내림차순 정렬 idx = 0 # 인덱스를 기록할 변수 for i in range(n): if sequence[i][0] == m: # m이 나오는 인덱스 기록 idx = i break for i in range(n): # 공동 i등이 나올 수 있는 것을 찾기 위해 필요한 과정. # i가 아래부터 올라가므로 공동 기록 포함해..
코드 # 버블정렬 사용 tc = int(input()) for i in range(tc): num = [*map(int, input().split())][1:] cnt = 0 for j in range(len(num)): for k in range(j+1, len(num)): if num[j] > num[k]: num[j], num[k] = num[k], num[j] cnt += 1 print(i+1, cnt)
코드1 n = int(input()) weightlimit = [*map(int, input().split())] m = int(input()) boxweight = [*map(int, input().split())] weightlimit.sort() # 오름차순 정렬 boxweight.sort() # 오름차순 정렬 cnt = 0 # 개수를 세어줄 변수 while 1: if len(boxweight) == 0: break # 옮길 박스가 없으면 break for i in range(n-1,-1,-1): # 거꾸로 세어준다. if not len(boxweight): break if weightlimit[-1] < boxweight[-1]: # 옮길 수 없는 경우 print(-1) exit(0) for j ..
코드 import sys input = sys.stdin.readline n = int(input()) series = list(map(int, input().split())) sorted_series = sorted(series) # 정렬된 리스트 복사 new_series = [] # 새로운 수열 for i in range(n): k = sorted_series.index(series[i]) # 정렬된 리스트에서 원래 수열이 있는 인덱스를 찾고 new_series.append(k) # 새로운 수열을 만들어 준다. sorted_series[k] += 10000 # index는 처음 만나는 인덱스를 반환해주므로 10000을 더해주면 해당 X print(*new_series) 수의 크기가 1000보다 작거나..
계수정렬 특정 조건이 부합할 때만 사용할 수 있는 정렬이지만, 매우 빠른 정렬 알고리즘이다. 조건 1. 최소값과 최대값의 차이가 100만 이하일 경우 2. 데이터가 양의 정수일 경우 3. (+데이터 크기가 많이 중복되어 있을 경우) 특징 가장 큰 데이터와 가장 작은 데이터의 차이가 너무 크면 사용할 수 없다. 모든 범위르 ㄹ담을 수 있는 크기의 리스트를 선언해야하기 때문이다. 계수정렬은 직접 데이터의 값을 비교한 후에 위치를 정렬하는 방식이 아니다. 별도의 리스트 선언 후, 그 안에 정렬에 대한 정보를 담는다. 데이터 범위가 한정되어 있으면 효과적으로 사용할 수 있다. 항상 빠르게 동작하며, 기수정렬과 더불어 가장 빠른 정렬 알고리즘이다. 코드 # 계수정렬 array_1 = [7,5,9,0,3,1,6,2..
퀵정렬 가장 많이 사용되는 정렬 알고리즘 중 하나. 퀵정렬과 병합정렬 알고리즘은 대부분의 프로그래밍 언어에서 정렬 라이브러리의 근간이 된다. 퀵정렬 Idea 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸면 어떨까? 퀵정렬은 기준(Pivot, 피벗)을 설정한 다음 큰 수와 작은 수를 교환한 후 리스트를 반으로 나누는 방식으로 동작한다. 피벗을 설정하고 리스트를 분할하는 방법에 따라 퀵정렬을 구분하는데, 여기서는 호어방식을 다룰 것이다. 호어방식 리스트에서 첫 번째 데이터를 피벗으로 정한다. 피벗 설정 후 왼쪽에서는 피벗보다 큰 데이터를, 오른쪽에서는 피벗보다 작은 데이터를 찾고 교환한다. 이 과정을 반복하면 정렬이 수행된다. 특정 리스트에서 피벗을 설정하여 정렬을 수행한 후에 ..
삽입정렬 데이터를 적절한 곳에다가 삽입하는 정렬이다. 삽입정렬은 필요할 때만 위치를 바꾸므로 데이터가 거의 정렬되어 있을 때 효율적이다. cf. 선택정렬은 현재 데이터의 상태과 상관없이 무조건 모든 원소를 비교한다. 삽입 정렬에서는 특정한 데이터가 삽입될 위치를 선정할 때, 삽입될 데이터보다 작은 값을 만나면 그 위치에서 멈추면 된다. (특정 데이터의 왼쪽 부분은 이미 정렬이 된 상태이기 때문이다.) 인덱스가 0인 데이터는 이미 정렬되어있다고 가정하고 해당 위치에 고정시킨다. 코드 array = [7,5,9,0,3,1,6,2,4,8] for i in range(1, len(array)): for j in range(i, 0, -1): if array[j] < array[j-1]: array[j], arr..
선택정렬 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복하는 정렬. 즉, 가장 작은 것을 선택해 앞으로 보내는 과정을 반복 수행하는 정렬방법이다. 이중 for문을 이용해 구현할 수 있다. 코드 # 선택정렬 array = [7,5,9,0,3,1,6,2,4,8] for i in range(len(array)): min_index = i for j in range(i+1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = array[min_index], array[i] print(array) # [0,1,2,3,4,5,..