주어진 좌표보다 작은 좌표의 갯수를 각각 구하는 문제이다. 조건은 중복이 없어야 한다는 것.
마찬가지로 집합 객체 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);