Notice
Recent Posts
Recent Comments
Link
HwangHub
[딕셔너리] boj 18870. 좌표 압축 본문
문제 해석
위 문제는 N개의 수가 주어질 때, 해당 수들이 일직선 상에서 왼쪽부터 "몇 번째" 숫자인지만 출력해주면 되는 문제다. 즉, 중복된 숫자의 개수는 고려하지 않아도 된다.(ㅎㅎ)
풀이 코드
첫 번째 생각
문제를 잘못 이해하고 짠 코드이다. 아래 코드는 예제 2를 3 0 3 0 3 0 으로 출력한다.
당연히 중복된 숫자가 나온 뒤에는 accumulative value를 계산해줘야 한다고 생각했는데, 그렇게 하면 예제 2에서 3 0 3 0 3 0이 나오는 게 맞다. 그래서 고민하다가, "아, 그냥 동일 숫자는 동일 순번만 뽑아주고 넘어가는구나..."라고 이해했다. 코드 순서를 고려해서 기껏 구현해놨더니 내 생각보다는 더 단순한 문제였다.
# N개의 수가 주어지고 : 1 <= N <= 1,000,000
# N개의 수 각 항을 자기보다 작은 수의 개수로 변환
from collections import defaultdict as dd
import sys
input = sys.stdin.readline
t = int(input())
d = dd(int)
li = list(map(int,input().split()))
order = -1
acc = 0
_li = li.copy()
_li.sort(key=lambda x : x)
# for i in _li: print(i, end=' ')
for i in range(t):
if i > 0 and _li[i] == _li[i-1]:
d[_li[i]] = order
# print(d[_li[i]])
acc += 1
# print(acc)
else:
order += 1
order = order + acc
acc = 0
d[_li[i]] = order
for i in li:
print(d[i], end=' ')
두 번째 생각 : 정답
# N개의 수가 주어지고 : 1 <= N <= 1,000,000
# N개의 수 각 항을 자기보다 작은 수의 개수로 변환
from collections import defaultdict as dd
import sys
input = sys.stdin.readline
t = int(input())
d = dd(int)
li = list(map(int,input().split()))
order = -1
acc = 0
_li = li.copy()
_li.sort(key=lambda x : x)
for i in range(t):
if i > 0 and _li[i] == _li[i-1]:
d[_li[i]] = order
else:
order += 1
d[_li[i]] = order
for i in li:
print(d[i], end=' ')
'workspace > 알고리즘' 카테고리의 다른 글
[data structure/tree] 백준 1991. 트리 순회 (0) | 2023.05.12 |
---|---|
[DP] 11726. 2 x N 타일링 (0) | 2023.05.09 |
[우선순위큐] boj 1417. 국회의원 선거 (1) | 2023.05.09 |
[딕셔너리] boj 13414. 수강신청 (1) | 2023.05.09 |
[정렬] boj 10989. 수 정렬하기3 (1) | 2023.05.09 |
Comments