BAEKJOON #18870 (정렬) - python

nathan·2021년 7월 18일
0

알고리즘문제

목록 보기
17/102

좌표압축

출처 : 백준 #18870

시간 제한메모리 제한
2초512 MB

문제

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다.

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.


입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.


출력

첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.


제한

1 ≤ N ≤ 1,000,000
-109 ≤ Xi ≤ 109


입출력 예시

예제 입력 1

5
2 4 -10 4 -9

예제 출력 1

2 3 0 3 1


예제 입력 2

6
1000 999 1000 999 1000 999

예제 출력 2

1 0 1 0 1 0


풀이

풀이 설명

  • 처음에는 집합, 딕셔너리 자료형을 이용하지 않았다.
  • 그래서 list.index()를 사용할 때 O(N)의 시간이 소요되었고, 결국 시간초과가 나오게 되었다.
  • 두 번째 풀이의 핵심은 다음과 같다.
    • 집합 자료형을 이용하여 중복된 값을 제거해주었다.
    • 딕셔너리를 통해 값을 탐색하는 시간이 O(1)만 걸리도록 하였다.
    • 이를 통해 시간초과를 피할 수 있었다.

느낀점

  • 앞으로는 문제에서 제시된 시간 제한 및 메모리 제한을 통해 시간 복잡도를 어느정도로 맞춰야 할지 어느정도 가늠할 수 있게 됐다. (조금 더 신경쓰자)
  • 항상 신경쓴다고 생각하지만 제한 조건을 조금 더 자세히 뜯어볼 필요가 있다고 느꼈다. (N의 개수 등..)

python code - 처음 풀었던 풀이 (오답 : 시간초과)

# 백준 18870번
from sys import stdin
def solution(n, arr):
    answer = [0] * n
    temp = []
    for i in range(n):
        temp.append((arr[i], i))
    
    temp = sorted(temp, key = lambda x : x[0])

    j = 0
    for _ in range(n):
        idx = temp[j]
        if j > 0 and temp[j][0] == temp[j-1][0]:
            answer[idx[1]] = answer[temp[j-1][1]]   # 같은 값이 존재하면 answer의 이전 인덱스에 해당하는 값을 넣어준다.
            temp.pop(j)                             # 그리고 해당 값을 뺀다.
        else:
            answer[idx[1]] = temp.index(idx)
            j += 1
    
    for k in range(n-1):
        print(answer[k], end=" ")
    print(answer[-1])


n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
solution(n, arr)

python code - 두 번째 풀었던 풀이 (정답)

# 백준 18870번
from sys import stdin
def solution(n, arr):
    answer = [0] * n
    temp = set()
    for i in range(n):
        temp.add(arr[i])
    
    comparison = []
    for t in temp:
        comparison.append(t)
    comparison = sorted(comparison)
    
    dictionary = {}
    for c in range(len(comparison)):
        dictionary[comparison[c]] = c 
    
    for k in range(n):
        answer[k] = dictionary[arr[k]]
    
    for k in range(n-1):
        print(answer[k], end=" ")
    print(answer[-1])


n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
solution(n, arr)
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글