https://www.acmicpc.net/problem/18870
수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const [n, ...arr] = require('fs')
.readFileSync(filePath)
.toString()
.trim()
.split(/\s/);
const parseIntArr = arr.map(item => parseInt(item));
const set = [...new Set(parseIntArr)].sort((a, b) => a - b);
const object = {};
const compressionArr = [];
for (let i = 0; i < set.length; i++) {
object[set[i]] = i;
}
for (let i = 0; i < n; i++) {
compressionArr.push(object[parseIntArr[i]]);
}
console.log(compressionArr.join(' '));
원래는 배열을 사용해서 풀었는데 시간초과가 나와서 오브젝트를 사용해서 풀었다.
배열을 사용하면 시간복잡도가 o(n)이지만 오브젝트를 사용하면 o(1)이 된다.