Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 18870 : 좌표 압축

비망노트 2021. 10. 28. 11:55

문제

수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.

예제입력 예제출력
5
2 4 -10 4 -9
2 3 0 3 1
6
1000 999 1000 999 1000 999 
1 0 1 0 1 0

 

❌ 풀이 (시간초과)

const input=require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const n=input.shift();
// n = 5
// input =[ '2 4 -10 4 -9' ]

let arr = input[0].split(' ').map(x=>Number(x));
// arr = [ 2, 4, -10, 4, -9 ]
let sorted = input[0].split(' ').map(x=>Number(x)).sort((a,b)=>a-b);
// sorted = [ -10, -9, 2, 4, 4 ]

let set = new Set(sorted);
let coord = [...set];
// coord = [ -10, -9, 2, 4 ]

let answer='';
for(let i=0;i<n;i++){
   
    for(let j=0;j<coord.length;j++){
        if(arr[i]===coord[j]){
            answer += `${j} `;
        }
    }
}
console.log(answer);

입력값을 정렬해 sorted 배열로 만들고

sorted 배열을 set 메서드를 사용해 중복을 제거해주었다.

이중 반복문을 사용해 정렬되지않은 입력값배열 arr 의 값과

중복제거 정렬된 coord의 값이 같으면 coord의 인덱스 j를 answer에 넣는 방식으로 작성했다.

시간초과..

 

 

✅ 다른풀이참고

const input=require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const n=input.shift();

let arr = input[0].split(' ').map(x=>Number(x));
let sorted = input[0].split(' ').map(x=>Number(x)).sort((a,b)=>a-b);

let set = new Set(sorted);
let coord = [...set];

let answer=[];
let obj ={};
coord.forEach((a,b)=> obj[a] = b);
❗ //obj = { '2': 2, '4': 3, '-10': 0, '-9': 1 }
❗ //ex) obj[2] = 2    obj[-9] = 1      obj[5] = undefined

for(let i=0;i<n;i++){
    answer.push(obj[arr[i]]);
}
console.log(answer.join(' '));

객체 초기자 {} 를 해당 값들의 인덱스를 함께 묶어주어 풀이했다.

obj[2] 를 출력하면 2, obj[-9]를 출력하면 1이나온다.

obj에 없는값은 undefined가 출력되며

해당 obj를 이용해 for문 하나만 사용해 풀이가 가능하다.

 

정렬되지않은 입력값 arr 배열의 값이 obj[] 에 들어가며

obj로 함께 묶여있던 해당값의 인덱스가 answer에 push된다.

 

객체초기자는 봐도봐도 헷갈린다..

 

 

-출처

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