백준(BOJ) 문제 풀이

백준 11651번 문제(좌표 정렬하기 2) 파이썬(Python) 풀이 [로밍맨]

로밍맨 2022. 5. 9. 18:00
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

 

정답 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
 
class Point:
  def __init__(self, x, y):
    self.x = x
    self.y = y
 
  def __lt__(self, other):
    return self.y < other.y if self.y != other.y else self.x < other.x
 
  def __repr__(self):
    return str(self.x) + ' ' + str(self.y)
 
def solve():
  n = int(sys.stdin.readline().rstrip())
  arr = []
  for _ in range(n):
    a, b = map(int, sys.stdin.readline().rstrip().split())
    arr.append(Point(a, b))
  arr.sort()
  for item in arr:
    print(item)
 
solve()
 
cs

 

풀이 영상에서 보여드린 것처럼 이 문제는 훨씬 더 간단한 풀이가 있습니다.

하지만 문제가 복잡한 경우 종종 class 를 직접 정의하면서 문제를 풀기도 하기에 비교적 간단한 문제에서 먼저 보여드리는 차원에서 class 를 이용하여 문제를 풀어보았습니다.

기본적인 흐름은 최근에 다시 풀이한 11650번 문제와 동일합니다.

https://roamingman.tistory.com/75

데이터를 읽고, 리스트에 담고, 정렬하고, 출력하는 것입니다.

다른 점은 리스트에 담는 데이터가 tuple 이 아닌 직접 정의한 class의 객체라는 것입니다.

객체에 대하여 정렬의 기준을 정해주고, 출력하는 방식을 정해주는 방식을 통하여 사용하는 쪽(solve 함수 내부)에서는 특별히 다른 작업이 필요 없다는 것이 이 풀이의 묘미라고 할 수 있습니다.

 

728x90

 

원래는 파이썬에 특화된 문법을 사용하지 않으려고 하는데, 이번 풀이에서는 꽤나 사용하였습니다.

아무래도 class 를 이용하다보니 어쩔수 없이 사용하게 된 부분도 있었고,

이러한 문법(A if B else C)의 경우 가독성이 오히려 더 낫다고 판단하여 이렇게 풀이를 진행하였습니다.

참고로 C 언어의 문법으로 바꾸자면, 아래와 동일한 의미입니다.

1
2
3
4
5
6
7
8
9
if (B) {
 
 A;
 
else {
 
 C;
 
}
cs

영상에서 이야기 하였지만 한 번 더 짚고 싶은 내용은 파이썬의 tuple 에 대한 기본적인 비교 방식입니다.

tuple 의 가장 첫 번째 item 끼리 비교를 실시하고, 만일 동일하다면 그 다음, 동일하다면 그 다음, ... 이런 식으로 비교를 실시한다는 것입니다.

이 문제의 풀이에서는 다루지 않았지만, 만일 각 tuple 의 item 수가 다른 경우는 그럼 어떻게 될까요?

제가 설명을 드리는 것보다 아래 링크에 잘 정리되어 있으니 참고 바랍니다.

https://newbedev.com/how-does-tuple-comparison-work-in-python

이러한 성질을 잘 이용하면 코드의 길이가 매우 짧으면서도 가독성이 좋은 코드를 작성할 수 있습니다.

 

풀이는 아래 영상을 참고 바랍니다.

https://www.youtube.com/watch?v=__F63AX1UA8 

 

저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)

728x90
반응형