
주어진 좌표보다 작은 좌표의 갯수를 각각 구하는 문제이다. 조건은 중복이 없어야 한다는 것.
마찬가지로 집합 객체 set을 이용해 중복을 제거한 후 풀 수 있는데, 간단하게 접근하다가 밑 코드와 같이 따로 결과를 갖는 배열을 만들었는데 메모리 초과가 발생하였다.
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
let N = Number(input[0]);
let arr3 = [];
let arr2 = [...new Set(input[1].split(' ').map(Number))];
for (let i = 0; i < N; i++)
{
let k = 0;
for (let j = 0; j < arr2.length; j++)
{
if (Number(input[1].split(' ')[i]) > arr2[j])
k++;
}
arr3.push(k);
}
console.log(arr3.join(' '));
강의를 보며 문제를 풀 수 있었는데,
Set을 이용해 중복을 제거한 배열과 원래 입력 배열을 따로 가지고 있는다.Map (딕셔너리) 자료형으로 중복 제거와 정렬이 완료된 배열에 대해 key:value 형태로 값과 인덱스를 부여해준다.Map의 Key로 사용하여 각각의 index를 출력해준다.let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
let N = Number(input[0]);
let arr3 = [];
let arr2 = [...new Set(input[1].split(' ').map(Number))];
for (let i = 0; i < N; i++)
{
let k = 0;
for (let j = 0; j < arr2.length; j++)
{
if (Number(input[1].split(' ')[i]) > arr2[j])
k++;
}
arr3.push(k);
}
console.log(arr3.join(' '));
-Set, Map을 활용하면 조금 더 효율적으로 문제를 풀 수 있기 때문에 꼭 숙지하고 기본적인 각각의 메서드를 숙지하는 것이 좋을 것 같다.
N과 나머지 입력을 분리하고 key:value 형식으로 딕셔너리를 만들까 생각했지만 나이, 이름이 중복될 경우 key가 유일하지 못하기 때문에 배열로 만들었다.
나이 순으로 2차원 배열을 정렬한 후
나이는 Number, 이름은 String으로 백틱을 이용해 하나의 문자열로 합쳤다.
console.log 호출을 최소화하기 위해 버퍼를 사용해 출력해 주었다.
let fs = require('fs')
let input = fs.readFileSync('/dev/stdin').toString().split('\n')
let N = Number(input[0])
let arr = []
for (let i = 1; i <= N; i++)
arr.push([Number(input[i].split(' ')[0]), input[i].split(' ')[1]])
arr.sort((a, b) => {
if (a[0] > b[0])
return 1;
else if (a[0] < b[0])
return -1;
return 0;
})
let res = '';
for (let i = 0; i < N; i++)
res += `${arr[i][0]} ${arr[i][1]}\n`
console.log(res)
.sort() 를 사용해 풀면 시간 복잡도가 굉장히 많이 나올 것 같지만 마땅한 방법이 생각이 안나서 고민했다.index로 놓고 나오는 숫자마다 하나씩 더하는 계수 정렬 방식으로 푸니 풀기도 쉽고, 시간 복잡도도 널널했다..sort도 만능이 아니고, 각각의 상황에 따라 효율적인 정렬 방법이 있으니, (이 경우는 비슷한 숫자가 많이 나오기 때문에) 꼭 기억해둬야 한다.let fs = require('fs')
let input = fs.readFileSync('/dev/stdin').toString().split('\n')
let arr = new Array(10).fill(0)
for (let i = 0; i < input[0].length; i++)
arr[Number(input[0][i])] += 1
let res = '';
for (let i = 9; i > -1; i--)
{
if (arr[i] === 0)
continue
for (let j = 0; j < arr[i]; j++)
res += `${i}`
}
console.log(res);