코딩테스트 대비/백준 알고리즘
BOJ - 18870 좌표 압축
JellyApple
2024. 5. 25. 18:08
문제 : https://www.acmicpc.net/problem/18870
문제 등급: 실버2
문제 아이디어 ; 정렬 후 딕셔너리를 사용해서 index를 순위로 표현 해준다.
문제 풀이
1) 좌표 압축 : 각 값을 크기 순위로 변형 하는 것이다. 문제 이해 부터 어려웠는데 결론적으로 각각 입력 받은 좌표값들이
전체 좌표값들 중에서 몇 번째로 큰 좌표인지를 입력받은 형태와 동일하게 출력 해준다.
2) 입력 배열
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
let N = Number(input[0]);
let arr = input[1].split(" ").map(Number);
3) 중복 제거 및 오름차순 정렬 : 서로 다른 수라 했기 때문에 중복을 제거 해준다. (서로 다른 좌표)
let arrSet = [...new Set(arr)];
arrSet.sort((a,b)=>a-b);
4) Dictionary 사용 : let myMap = new Map();
let myMap = new Map();
5) 매핑 수행 : arrSet[i]을 i로 매핑해준다.
for(let i=0;i<arrSet.length;i++){
myMap.set(arrSet[i],i);
}
6) 매핑된 값 가져오기
answer="";
for(let x of arr){
answer+=myMap.get(x)+" "
}
console.log(answer);
이해 자체가 어려웠던 문제였다. 또한 딕셔너리를 활용해 index로 매핑하는 법을 새로 배우게 되었다.
시간복잡도는 정렬 기능을 수행했기 때문에 O(NlogN)이다.
전체 코드
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
let N = Number(input[0]);
// 입력 배열
let arr = input[1].split(" ").map(Number);
// 중복 제거 위한 집합 (서로 다른 수이기 때문)
let arrSet = [...new Set(arr)];
arrSet.sort(function(a,b){
return a-b;
})
// dictionary 사용
let myMap = new Map();
// 매핑 수행
for(let i=0;i<arrSet.length;i++){
myMap.set(arrSet[i],i);
}
// 매핑된 값 가져오기
answer="";
for(let x of arr){
answer+=myMap.get(x)+" "
}
console.log(answer);