본문 바로가기
백준 알고리즘/정렬

[백준 11650, 11651, 10814][파이썬] 좌표 정렬하기 (sort 정렬 기준 정하는 방법, sys 라이브러리 사용법)

by 웅대 2023. 1. 20.
728x90
반응형

 

https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

이 문제의 경우 이중 리스트로 모두 저장한 후 정렬을 하면 된다.

 

기본적으로 sort 함수는 오름차순으로, 앞 순서부터 정렬을 하기 때문에 이 문제에서는 그냥 sort 정렬을 하면 된다.

 

n=int(input())
li=[]
for i in range(n):
    [a, b] = map(int, input().split())
    li.append([a, b])
li.sort()
for i in li:
    print(i[0], i[1])

 

1. sort 함수 기준 정하기

위 문제는 그냥 sort 함수를 사용하면 됐지만 첫 번째 값이 아닌 두 번째 값을 기준으로 내림차순 정렬을 한다던가 이럴 때는 sort 함수의 기준을 바꿔주어야 한다.

 

sort 함수의 인자로 key = function을 넣어주면 되고 function이 곧 기준이 된다.

 

예를 들어 두 번째 값을 기준으로 오름차순으로 정렬을 하는데 두 번째 값이 같을 때에는 첫 번째 값을 기준으로 오름차순으로 하고싶다면

 

li.sort(key = lambda x: (x[1], x[0]))

위와 같이 우선순위를 변경하면 된다.

 

만약 두 번째 값을 기준으로 내림차순으로 정렬을 하는데 두 번째 값이 같을 때에는 첫 번째 값을 기준으로 오름차순으로 하고 싶다면

 

li.sort(key = lambda x: (-x[1], x[0]))

위와 같이 우선순위를 변경하면 된다.

 

아니면 오로지 두 번째 값을 기준으로만 오름차순 정렬을 하고 첫 번째 값은 그냥 입력받은 순서대로 두고 싶다면

li.sort(key=lambda x: x[1])

위와 같이 우선 순위를 두 번째 값으로 하나만 설정하면 된다.

2. sys 라이브러리를 사용하여 input 시간 줄이기

나는 그냥 input을 사용하여 문제를 해결했는데 시간이 오래 걸렸다.

 

이럴 때 sys 라이브러리를 사용하면 시간을 줄일 수 있다.

 

input()을 사용하는 것이 아닌 sys.stdin.readline()을 사용하면 된다.

 

내가 사용한 코드에서 input만 변경해보았다.

 

import sys
n=int(sys.stdin.readline())
li=[]
for i in range(n):
    a, b = map(int, sys.stdin.readline().split())
    li.append([a, b])
li.sort()
for i in li:
    print(i[0], i[1])

 

<input()을 사용한 결과>

<sys.stdin.readline()을 사용한 결과>

 

11651

https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

위에서 설명한 sort 함수의 기준대로 풀면 된다.

import sys
n=int(input())
li=[]
for i in range(n):
    a, b = map(int,sys.stdin.readline().split())
    li.append([a,b])
li.sort(key=lambda x: (x[1], x[0]))
for i in li:
    print(i[0], i[1])

10814

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

위에서 설명한 sort 함수의 기준대로 풀면 된다.

import sys
n=int(input())
li=[]
for i in range(n):
    a, b = sys.stdin.readline().split()
    a=int(a)
    li.append((a,b))
li.sort(key=lambda x:x[0])
for i in li:
    print(i[0], i[1])
728x90
반응형

댓글