본문 바로가기

알고리즘

백준 11651 좌표 정렬하기 2 [개인적인 풀이 과정]

예제의 5개의 점을 넣어봤다.

출력은 y값이 작은 순서대로 아래에서부터 그리고 왼쪽에서부터 출력되게 되어있다.

구현 하는게 아직 익숙치 않아 값이 2차원 좌표 형태로 들어오기 때문에 2차원 리스트에 대해 찾아봤다.

파이썬에서 리스트와 배열을 혼용해서 사용하는데 파이썬의 리스트는 dynamic array라고 한다. (정확히 뭔지는 모르겠다.)

 

배열 : 데이터의 크기가 정해져 있고, 추가적인 삽입 삭제가 일어 나지 않으며 검색을 필요로 할 때 유리. 

리스트 : 데이터의 크기가 정해져 있지 않고, 삽입 삭제가 많이 일어나며, 검색이 적은 경우 유리.


출처: https://changun516.tistory.com/9 [하루의 쉼터]

 

파이썬에서의 리스트는 특정 부분의 추가 삭제도 가능하고, 인덱스를 통한 접근이 가능하다고 한다.

 

아래 코드는 다음과 같은 순서로 돌아간다.

 

1. 점 개수 입력 

2. 빈 리스트 만들기

3. 입력 개수만큼 x, y> y, x 형태로 리스트에 추가

4. y, x에 대해 오름차순 정렬 참고로 내림차순은 s = sorted(array, reverse=True)

5. y, x에 대해 정렬된 배열을 포문을 통해 한줄 씩 x, y로 위치 바꾸고 프린트하기

n = int(input())
array = []

for i in range(n):
    x, y = map(int, input().split())
    array.append([y, x])

s = sorted(array)  

for a, b in s:
    print(b, a) 

위 식에서 아래 포문만 바꿔서 표현할 경우 아래와 같이 변경이 가능하다.

n = int(input())
array = []

for i in range(n):
    x, y = map(int, input().split())
    array.append([y, x])

s = sorted(array)  

for _ in range(len(s)):
     print(s[_][1], s[_][0])

이렇게 rev의 길이를 인덱스 값으로 설정하고, 인덱스값에 해당하는 y값부터 출력, 그다음 x값을 출력하여 다음줄로 넘어가는 형태를 만들 수 있다.

 

input을 사용했는데 연산속도가 너무 느리게 느껴진다.

맞긴 했는데 속도가 영...

input대신 readline사용하면 속도가 더 빨라질 까 input부분만 바꿔서 돌려보니 정말 빨라졌다.

import sys
n = int(sys.stdin.readline())
array = []

for i in range(n):
    x, y = map(int, sys.stdin.readline().split())
    array.append([y, x])

s = sorted(array)  

for a, b in s:
    print(b, a) 

 

input과 readline의 속도차이... 10배가 넘는다.  TypeError는 split괄호를 안넣어서 생겼다.