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

    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

    문제

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

    입력

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

    출력

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

     

    해결코드

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

    문제풀이

    이차원 리스트로 나오니 문제가 순간 이해가 안갔다.

    천천히 읽어보니 그냥 5개의 좌표를 받아서 x좌표순으로 먼저 정렬하고, y좌표순으로 정리한 후

    출력하면 해결되는 문제이다.

    일단 입력은 readline()으로 받아 입력시간을 줄여주고

    li라는 리스트를 하나 선언해준다.(좌표값을 저장하기 위한 용도)

    그 다음에는 n개 만큼 좌표를 받아야 하므로 for문을 돌려 li에 좌표값을 넣어준다.

    (이차원 리스트라 li.append 안에도 list를 또 써줘야 한다는 점..)

    li가 채워진 후 정렬을 해야하는 데 앞에서 말한 것 처럼 x좌표 우선으로 정렬하고 y좌표 순으로 정렬하면 된다.

    li.sort(key=lambda x: (x[0], x[1])) 에서 x[0]은 말그대로 li안쪽 list에서 0번째값을 우선으로 정렬,

    그리고  x[1]은 1번째값을 우선으로 정렬하라는 뜻이다.

    그리고 출력을 하면 되는데 이차원 리스트를 그냥 변수 하나로 for문을 돌려 출력하면

    이 '[', ']' 대괄호가 벗겨지지 않고 출력된다. 그러므로 for a,b in li: 이것처럼

    변수 두 개를 선언하여 출력도 print(a,b)이렇게 출력해야 대괄호가 벗겨져서 출력된다.

     

    728x90

    댓글