티스토리 뷰
[CodingTest] python 백준 Baekjoon #18870 좌표 압축 / 정렬 / index( ) 시간복잡도
Happyoon ~ 2021. 11. 20. 18:18https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
문제는 쉬운데 시간 초과가 나서 검색해서 풀었다.
시도 1 - 시간초과
import sys
n = int(sys.stdin.readline())
arr = list(map(int,sys.stdin.readline().split()))
#결과값 저장 리스트
res = [0]*n
#집합으로 묶고 내림차순 정렬
set_arr = sorted(set(arr),reverse = True)
#집합으로 묶인 리스트의 인덱스 거꾸로 저장
cnt_lst = [len(set_arr)-i-1 for i in range(len(set_arr))]
for i in range(len(arr)):
if arr[i] in set_arr:
res[i] = cnt_lst[set_arr.index(arr[i])]
print(' '.join(map(str,res)))
set을 활용해 집합으로 바꾸어 중복값을 없애고 해당 숫자 보다 작은 숫자의 갯수를 cnt_lst에 저장했다.
그리고, arr과 set_arr을 비교하면서, 값이 같다면, 해당 숫자가 있는 set_arr의 인덱스를 cnt_lst에 넣어 res에 저장했다.
값은 잘 나오는데 시간초과라서 생각하다가 cnt_lst는 단순히 인덱스 저장 리스트라서 필요가 없을 것 같아서 아래에서 삭제해주었다.
시도 2 - 시간초과
import sys
n = int(sys.stdin.readline())
arr = list(map(int,sys.stdin.readline().split()))
#결과 저장 리스트
res = [0]*n
#arr을 집합화하고 내림차순 정렬
set_arr = sorted(set(arr))
for i in range(len(arr)):
if arr[i] in set_arr:
res[i] = set_arr.index(arr[i])
sys.stdout.write(' '.join(map(str,res)))
cnt_lst 없애면서 내림차순하지 않고 오름차순으로 바꿔 코드를 더 깔끔하게 수정했지만 또다시 시간초과 .. ㅠ
이유를 모르겠어서 검색했더니 나랑 풀이가 비슷한 사람이 있었다.
이유는 index() 때문이었다는 것!!!
list.index(i) 형태의 시간 복잡도 = O(N)
index[i] 형태의 시간 복잡도 = O(1)
그래서 딕셔너리를 활용했다고 한다.
dict는 시간복잡도 O(1)
시도 3 - 성공
import sys
from typing import List
n = int(sys.stdin.readline())
arr = list(map(int,sys.stdin.readline().split()))
#결과 저장 리스트
res = [0]*n
#arr을 집합화하고 내림차순 정렬
set_arr = sorted(set(arr))
dic = {set_arr[i]:i for i in range(len(set_arr))}
print(" ".join(map(str,[dic[item] for item in arr])))
다른 사람 코드도 비슷하다.
'알고리즘 > Baekjoon' 카테고리의 다른 글
[CodingTest] python 백준 Baekjoon #2231 분해합 / 브루트포스 (0) | 2021.11.20 |
---|---|
[CodingTest] python 백준 Baekjoon #2798 블랙잭 / 정렬 (0) | 2021.11.20 |
[CodingTest] python 백준 Baekjoon #10989 수 정렬하기 3 / 정렬 (0) | 2021.11.20 |
[CodingTest] python 백준 Baekjoon #11651 좌표 정렬하기 2 / 정렬 (0) | 2021.11.20 |
[CodingTest] python 백준 Baekjoon #2751 수 정렬하기 2 / 정렬 / stdout() (0) | 2021.11.20 |
- Total
- Today
- Yesterday
- Django
- 자바
- 덱
- CSS
- 백준
- 단계별로풀어보기
- Java
- R
- jsp
- 문자열
- baekjoon
- Case When
- 브루트 포스
- web
- 자바스크립트
- 정렬
- 장고
- 큐
- jQuery
- javascript
- 프로그래머스
- python
- Oracle
- 파이썬
- 고득점 키트
- brute force
- append
- html
- bootstrap
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 |
27 | 28 | 29 | 30 |