캐또's coding

18870 - 좌표 압축 -node.js 본문

기초 공부/백준 문제 풀이

18870 - 좌표 압축 -node.js

JS_K_coding 2023. 1. 16. 17:23

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

 

18870번: 좌표 압축

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

www.acmicpc.net


우선 문제를 풀기 전 좌표 압축이 무엇인지 좌표 압축을 왜 해야 하는 것인지 그 개념에 대해 이해할 필요를 느꼈다.

 

좌표압축은 간단히 말하자면 "데이터를 정렬, 다시 순서를 부여하기"인데 억단위가 넘어가는 데이터 중 중요한 구간이나 중요한 순자만 들고 있는 것을 말한다.

 

해당 문제의 설명 아래에도 다음과 같은 설명이 있다.

만약 정확한 값이 필요 없고 값의 대소 관계만 필요하다면, 모든 수를 0 이상 N 미만의 수로 바꿀 수 있습니다.

 

해당 문제에서는 정확한 값도 필요 없고 값 간에 차가 얼마인지도 필요 없고 그냥 순서만 출력해도 된다.

=> 따라서 모든 값을 정렬하고 값의 순서대로 인덱스를 부여하듯 해도 된다.

 

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
//입력 값을 불러 온다.

input.shift();
//첫 번째 값을 뺀다. 따로 쓰지 않으니 선언할당하지 않는다.

const arr = input[0]
  .split(" ")
  .map(Number)
  .sort((a, b) => a - b);
//setArr에 입력 받은 값을 숫자로 변경 후 정렬한다.

const set = new Set(arr);
//중복 값을 제거한다.

const map = new Map();
//정렬된 값에 숫자를 부여하기 위한 Map()

[...set].forEach((item, index) => {
  map.set(item, index);
});
//중복 제거된 값들 즉, 각 숫자들에게 index를 붙여준다.

let result = "";
//출력할 결과 result선언

input[0].split(" ").forEach((item, index) => {
  result += map.get(+item) + " ";
});
//원래 입력값 각각에 맞는 map 값을 찾아서 result에 추가

console.log(result);
//출력하면 문제 해결

 

문제 이해도가 떨어져서 사실상 검색을 통해서 문제를 해결했다. 코드를 따라 쳐보고 한 줄씩 읽어보면서 이해할 수 있었던 문제

Comments