본문 바로가기

[BOJ] - Python

[백준] 18870 : 좌표 압축 python

 

1. arr에 입력받은 좌표들을 저장함

2. s에 arr를 집합으로 바꾼 것을 저장함(중복제거)

3. sorted_arr에 arr의 인덱스와 arr의 원소를 저장함

4. sorted_arr를 내림차순 정렬함

5. sorted_arr의 값을 하나씩 확인하면서

그 값이 집합s 안에 있다면 집합에서 그 원소를 제거하고 집합 원소의 개수를 계산함

res라는 리스트에 [arr에서의 인덱스, arr 원소의 값, 집합의 길이(자신보다 작은 숫자의 개수]를 저장함

6. res의 2번열 즉, 자기보다 작은 수의 개수를 출력함

 

n = int(input())
arr = list(map(int,input().split()))
s = set(arr)
sorted_arr = []
for i in range(len(arr)):
    sorted_arr.append([i,arr[i]])
sorted_arr.sort(key=lambda x:(x[1]), reverse=True)
res = []
for i in range(len(arr)):
    if sorted_arr[i][1] in s:
        s.remove(sorted_arr[i][1])
    res.append([sorted_arr[i][0], sorted_arr[i][1], len(s)])
res.sort(key=lambda x:(x[0]))

for i in res:
    print(i[2],end= ' ')

전체적인 내용은 유사한데 딕셔너리를 쓰면 더 간단하게 구현할 수 있길래 고쳐봤다.

 

1. arr에 입력된 좌표를 저장한다.

2. arr에서 중복을 제거해 집합 s를 만든다.

3. s를 오름차순 정렬한다.

4. s를 리스트로 바꾼 s_list를 생성한다.

5. 딕셔너리 d를 생성한다.

key : arr에 저장된 좌표값

value : 그 좌표값보다 작은 값들의 개수

 

n = int(input())
arr = list(map(int,input().split()))
s = set(arr)
s = sorted(s)
s_list = list(s)
d = {}

for i in range(len(s)):
    d[s_list[i]] = i
for i in range(len(arr)):
    print(d[arr[i]],end= ' ')