[백준] 10814(나이순 정렬) python
문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
처음에는
나이, 이름 따로 입력 받아서 뒤에 입력된 사람의 나이가 더 적다면 tmp 변수 사용해서 앞뒤 값을 바꾸는 걸로 생각했다.
그런데
나이와 이름을 한번에 입력받아야 하는 문제가 있었고,
버블 정렬을 최적화해도 시간 초과로 에러가 떴다.
#1번
num = int(input())
age = []
name = []
for i in range(num):
age.append(int(input()))
name.append(input())
age.append(0)
name.append("1")
for i in range(num-1, 0, -1):
for j in range(i):
if(age[j] > age[j+1]):
tmp = age[j+1]
age[j+1] = age[j]
age[j] = tmp
tmp = name[j+1]
name[j+1] = name[j]
name[j] = tmp
for i in range(num):
print(age[i], name[i], sep=' ')
#2번
num = int(input())
age = []
name = []
for i in range(num):
age.append(int(input()))
name.append(input())
age.append(0)
name.append("1")
for i in range(num-1, 0, -1):
swap = True
for j in range(i):
if(age[j] > age[j+1]):
tmp = age[j+1]
age[j+1] = age[j]
age[j] = tmp
tmp = name[j+1]
name[j+1] = name[j]
name[j] = tmp
swap = False
if not swap:
break
for i in range(num):
print(age[i], name[i], sep=' ')
#3번
num = int(input())
age = []
name = []
for i in range(num):
age.append(int(input()))
name.append(input())
age.append(0)
name.append("1")
for i in range(num):
end = num - 1
while end > 0:
last_swap = 0
for i in range(end):
if(age[i] > age[i+1]):
tmp = age[i+1]
age[i+1] = age[i]
age[i] = tmp
tmp = name[i+1]
name[i+1] = name[i]
name[i] = tmp
last_swap = i
end = last_swap
for i in range(num):
print(age[i], name[i], sep=' ')
https://star-crab.tistory.com/22
정렬 문제가 아닌 것 같아 검색해보니, lambda를 썼다.
lambda는 함수를 한 줄로 만들어준다.
lambda 매개변수:표현식
#예제
def hap (x,y):
return x+y
#labmda
(lambda x,y:x+y)
여기에 sort 함수를 사용하여 두 수를 비교해서 자리를 바꿔주도록 한다.
#sort 함수 예제 > 오름차순으로 정렬
list_num = [1,5,2,6,7,45,2]
#1번 : 반환값 없는 거
list_num.sort()
print(list_num)
#2번 : 반환값 있는 거
print(sorted(list_num))
#sorted시, key 값에 따른 정렬
#1. 절댓값, 내림차순
#key = abs 절대값 기준으로 정렬
#reverse = true 기존 오름차순 정렬을 reverse (내림차순)
list_num = [-5, 3, -1, 0, 2, -4]
sorted_list = sorted(list_num, key = abs, reverse = True) #[-5, -4, 3, 2, -1, 0]
#2. 문자열 길이를 기준으로 정렬 (길이가 짧은 순서대로)
list_num = ["api", "app", "carrier", "demon", "aaa"]
sorted_list = sorted(list_num, key=len)
print(sorted_list) #['aaa', 'api', 'app', 'carrier', 'demon']
#문제점 : 오름차순으로 정렬하려면?
#3. 길이를 기준으로, 오름차순으로 정렬
list_num = ["api", "app", "carrier", "demon", "aaa"]
sorted_list = sorted(list_num, key= lambda x : (len(x), x))
print(sorted_list) #['aaa', 'api', 'app', 'demon', 'carrier']
num = int(input())
arr = []
for i in range(num):
age, name = input().split()
arr.append([int(age), name])
for i in sorted(arr, key = lambda x:x[0]):
print(i[0], i[1])
여기서 x는 아무런 함수 식이나 적용도 하지 않은 문자열 그 자체이므로 오름차순 정렬을 의미한다.
그렇다면 오름차순으로 정렬하되, 같은 숫자인 경우 두번째 인자[0]를 기준으로 재정렬한다.
https://velog.io/@rockwellvinca/python-sorted-sort-key-%EC%82%AC%EC%9A%A9%EB%B2%95