문제 링크
https://www.acmicpc.net/problem/11651
정답 코드는 아래와 같습니다.
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 함수 내부)에서는 특별히 다른 작업이 필요 없다는 것이 이 풀이의 묘미라고 할 수 있습니다.
원래는 파이썬에 특화된 문법을 사용하지 않으려고 하는데, 이번 풀이에서는 꽤나 사용하였습니다.
아무래도 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 (출처만 표시하면 자유롭게 이용 가능)
'백준(BOJ) 문제 풀이' 카테고리의 다른 글
백준 2263번 문제(트리의 순회) C++ 풀이 [로밍맨] (0) | 2022.08.18 |
---|---|
백준 1708번 문제(볼록 껍질) 파이썬(Python) 풀이 [로밍맨] (2) | 2022.07.21 |
백준 11650번 문제(좌표 정렬하기) 파이썬(Python) 풀이 [로밍맨] (0) | 2022.05.03 |
백준 1017번 문제(소수 쌍) 파이썬(Python) 풀이 [로밍맨] (0) | 2022.04.17 |
백준 1924번 문제(2007년) 파이썬(Python) 풀이 [로밍맨] (3) | 2022.03.15 |