[Python] 백준 알고리즘 온라인 저지 11651 좌표 정렬하기 2
https://www.acmicpc.net/problem/11651
파이썬의 내장 함수 sort는 두 가지의 수(2차원)를 정렬할 때 x의 우선으로 비교한 뒤 같으면 y값이 더 큰 것을 큰 값으로 정렬한다. 이를 이용하여 나는 두 수의 위치를 바꿔 sort를 하는 코드를 만들었다.
코드
n = int(input())
coordinate = []
minCoordinate = []
result = []
for _ in range(n):
coordinate.append(list(map(int, input().split())))
for i in range(0, len(coordinate)):
minCoordinate.append([coordinate[i][1], coordinate[i][0]])
minCoordinate.sort()
for i in range(0, len(minCoordinate)):
result.append([minCoordinate[i][1], minCoordinate[i][0]])
for i in result:
print(i[0], i[1])
결과적으로 이 방법으로 정답을 얻긴 하였으나 더 간단한 방법이 있을거라고 생각하여 다른 분들의 풀이를 참조한 결과.
better 코드
import sys
num = int(input())
coordinate = [list(map(int,sys.stdin.readline().split())) for i in range(num)]
coordinate.sort(key=lambda x: [x[1],x[0]])
for i in coordinate:
print(i[0],i[1])
풀이
직접 풀이한 코드는 단순히 리스트로 2차원 수들을 리스트로 받아 리스트안에 메모리를 할당하고 두 수의 위치를 뒤집어 minCoordinate 리스트에 다시 추가하고 sort함수를 이용하는 방법이다. (coordinate[0][0] -> coordinate[0][1] [1] -> [0] = minCoordinate) 풀이를 하면서 조금 더 짧고 간결한 코드가 있을 것이라고 생각했고 더 나은 코드를 발견하였다.
이는 더 빠른 연산을 위해 sys 모듈을 사용하고 coordinate를 선언함과 동시에 for문으로 num만큼 두 수를 리스트로 받아 저장한다.
coordinate = [list(map(int,sys.stdin.readline().split())) for i in range(num)]
==
#보통 for문 사용법
coordinate = []
for i in range(num):
list(map(int, sys.stdin.readline().split()))
또한 람다 표현식을 이용하여 두 수의 자리를 바꾸지 않고 정렬하는 법을 사용하였다.
coordinate.sort(key=lambda x: [x[1],x[0]])
# []안의 두 수 x에서 x[1]을 먼저 정렬하고 x[0]을 정렬함
이후에는 for문을 이용하여 i[0]과 i[1]를 한 줄에 출력한다.
직접 위치를 바꾸지 않고도 lambda를 이용하여 정렬하는 방법이 더 효율적이라고 생각된다.
실제로 시간 차이가 엄청 나서 놀랐다.
(따로 lambda 표현식에 대해 정리하였고 빠른 시일 안으로 업로드하겠습니다.) 업로드 완료 하였습니다.
람다 표현식(Lambda Expression) - Python
풀이 결과
내 코드
better 코드
'알고리즘' 카테고리의 다른 글
백준 10814번 나이순 정렬 파이썬 풀이 (0) | 2022.01.27 |
---|---|
백준 1181번 단어 정렬 파이썬 풀이 (0) | 2022.01.26 |
백준 11650번 좌표 정렬하기 파이썬 풀이 (0) | 2022.01.22 |
백준 1427번 소트인사이드 파이썬 풀이 (0) | 2022.01.21 |
백준 2108번 통계학 파이썬 풀이 (0) | 2022.01.18 |