[알고리즘] 백준 11651 (파이썬 풀이)

    728x90

    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

    문제

    2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

    입력

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

    출력

    첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

     

    해결코드

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

    문제풀이

    이 문제는 좌표 정렬 문제인데, 우선순위가 y좌표 먼저 정렬이고 그다음이 x좌표 정렬이다.

    일단 sys라이브러리를 사용하고 input = sys.stdin.readline으로 간편하게 n을 입력받는다.

    그리고 li라는 리스트 하나를 생성하고 n만큼 for문을 돌려 xx,yy라는 좌표 값을 받아준다.

    그리고 for문을 나와서 sort를 해주는데 li가 이차원 리스트이므로

    key=lambda x:(x[1],x[0]))을 해주면 x[1] 즉 y좌표값이 먼저 정렬되고 후에 x[0](=x좌표) 값이 정렬된다.

    한 줄에 하나씩 출력해야 하므로 for문을 이용해서 출력해주는데

    그냥 출력하면 [x, y]이런식으로 대괄호도 포함되어 나온다.

    그래서 print(*i)이런식으로 출력하게 되면 unpack되어서 나온다.

    728x90

    댓글