[백준 18870][파이썬] 좌표 압축 (파이썬 dictionary)

2023. 1. 31. 12:00·백준 알고리즘/정렬
728x90

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

처음 생각한 알고리즘은 다음과 같다.

 

1. 리스트를 새로운 집합으로 만들어서 중복을 제거한다.

 

2. 집합을 리스트로 바꾸어서 정렬 후 다시 리스트로 생성한다.

 

3. 새로운 리스트 요소들의 인덱스가 곧 자신보다 작은 요소들의 개수가 된다.

 

오름차순으로 정렬을 하게 되면 자연스럽게 인덱스가 자신보다 같거나 작은 요소의 개수가 된다.

 

자신보다 작은 요소를 구해야 하므로 중간에 집합으로 만드는 과정을 통해 중복을 제거한다.

 

이 방식으로 짠 코드는 다음과 같다.

 

import sys
n=int(sys.stdin.readline())
li=list(map(int, sys.stdin.readline().split()))
temp=list(sorted(set(li)))
for i in range(n):
    li[i] = temp.index(li[i])
for i in range(n):
    print(li[i], end=' ')

 

그러나 이러한 방식은 인덱스를 조사하는 과정에서 너무 많은 시간이 소모되고 결국 시간 초과가 발생했다.

 

인덱스를 조사하는 과정의 시간을 단축해야했다.

 

파이썬의 자료형인 dictionary를 사용하면 쉽게 해결할 수 있었다.

 

위의 1, 2번까지는 똑같은 과정을 진행하는데 3번을 변경해야한다.

 

list의 index 함수를 사용하는 것이 아니라 애초에 중복을 제거하고 정렬된 리스트에서 딕셔너리 자료형에 key-value 쌍으로 요소-인덱스를 넣어주면 된다.

 

그리고 출력할 때는 원래 인덱스의 값을 딕셔너리 자료형의 key값으로 넣어주면 된다.

 

import sys
n=int(sys.stdin.readline())
li=list(map(int, sys.stdin.readline().split()))
temp=list(sorted(set(li)))
dic = dict()
for i in range(len(temp)):
    dic[temp[i]]=i
for i in li:
    print(dic[i], end=' ')
728x90

'백준 알고리즘 > 정렬' 카테고리의 다른 글

[백준 1427][파이썬] 소트인사이드 (문자열을 리스트로, 리스트를 문자열로 변환) (리스트에서 특정 문자 제거)  (0) 2023.01.27
[백준 11650, 11651, 10814][파이썬] 좌표 정렬하기 (sort 정렬 기준 정하는 방법, sys 라이브러리 사용법)  (0) 2023.01.20
'백준 알고리즘/정렬' 카테고리의 다른 글
  • [백준 1427][파이썬] 소트인사이드 (문자열을 리스트로, 리스트를 문자열로 변환) (리스트에서 특정 문자 제거)
  • [백준 11650, 11651, 10814][파이썬] 좌표 정렬하기 (sort 정렬 기준 정하는 방법, sys 라이브러리 사용법)
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    bfs
    code tree
    푸쉬 알람
    RNN
    codetree
    binary search
    ChatPromptTemplate
    Merge
    다익스트라
    openvidu 배포
    Vector Store
    AWS Lambda
    스프링 OAuth2
    parametric search
    influxDB CLI
    스택
    nn.RNN
    embedding
    ci/cd
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[백준 18870][파이썬] 좌표 압축 (파이썬 dictionary)
상단으로

티스토리툴바