[BOJ] 11650: 좌표 정렬하기

이슬비·2022년 3월 11일
0

Algorithm

목록 보기
10/110

알고리즘을 공부한지 어느덧 10일차...! 즐겁다... 아마...? 오늘의 문제는 굉장히 간단한 것이었지만, 그 간단함을 캐치하지 못했기 때문에 오늘의 풀이도 빙글빙글 돌아갔다.

11650: 좌표 정렬하기

x축 기준으로 먼저 좌표들을 정렬한 후, y축 기준으로 좌표를 정렬하는 문제였다.

1. 내 풀이: 실패 (시간초과)

import sys

n = int(sys.stdin.readline())

num = []
for _ in range(n):
    num.append(sys.stdin.readline().split())

num.sort(key = lambda x: x[0])

for i in range(1,n):
    for j in range(2, n):
        if num[i-1][0] == num[j][0]:
            if num[i-1][1] > num[j][1]:
                new = num[i-1][1]
                num[i-1][1] = num[j][1]
                num[j][1] = new            

for i in range(n):
    print(" ".join(num[i]))

어떤가... 나의 빙글빙글 풀이가... 비교하면서 공부하기 위해 바로 다른 풀이를 적어보겠다!

2. 다른 풀이: 성공 ^.ㅠ

import sys

n = int(sys.stdin.readline())

num = []
for i in range(n):
    num.append(list(map(int, sys.stdin.readline().split())))
    
num.sort(key=lambda x: (x[0], x[1]))

for i in num:
    print(i[0], i[1])

나의 풀이와 굉장히 유사하면서도... 간단한 풀이이다. 이 풀이는 아래의 블로그를 참고했다.
(https://pacific-ocean.tistory.com/139)


1. 비교1: Good job ~

import sys

n = int(sys.stdin.readline())

먼저 sys 라이브러리를 import 해서 사용한 점은 아주 칭찬할만하다. 이제 메모리나 시간 효율을 위해서 몸이 완전히 sys에 적응한 듯하다 😀

2. 비교2: 아니 진심이야 map...?


num = []
for _ in range(n):
    num.append(sys.stdin.readline().split())

##############################################

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

풀이 보면서 깨달은 것은... 내가 map을 완전히 머리 속에서 지워버렸구나... 라는 사실이다. 정말 map을 쓸 생각조차 안하고 int()가 왜 안 되는 거지 ~? 어짜피 문자로 해도 알아서 판단하니까 저렇게 해야겠다 ~ 라고 생각한 듯... 잊지 말자... list(map(int, 문자열))...

3. 비교3: 자만하지 말기 ^^!

num.sort(key = lambda x: x[0])

for i in range(1,n):
    for j in range(2, n):
        if num[i-1][0] == num[j][0]:
            if num[i-1][1] > num[j][1]:
                new = num[i-1][1]
                num[i-1][1] = num[j][1]
                num[j][1] = new    
                
########################################
 
num.sort(key=lambda x: (x[0], x[1]))

내가 풀이의 이 부분을 보고 얼마나 웃었던지... 정말 나는 하나만 알고 둘은 모르는 사람이다. 처음에 lambda를 쓸 생각한 나 자신을 보며 크하하 내가 이정도라구 ~ 했는데, 역시 사람은 자만하면 안돼. 기억하자! lambda x: (1순위, 2순위)!

4. 비교4: 사소한 디테일이 발목을 잡을 수도...

for i in range(n):
    print(" ".join(num[i]))
    
############################

for i in num:
    print(i[0], i[1])

이 풀이에서는 심지어 print 문까지 배울 게 있었다... 저렇게 병렬로 출력할 수 있다는 사실을 깨닫지 못한 채 그냥 바로 문자열 만들어버렸다 (?) 진짜 이건 창의성이 뛰어나다고 해야하는지 독특하다고 해야하는지... 결국 저것도 다 시간이고 메모리인데... 앞으로는 이런 사소한 부분 끝!까지 신경 쓰도록 해야겠다!

오늘도 신기하구... 재미난 알고리즘의 세계 끝!

profile
정말 알아?

0개의 댓글