[CS & Algorithm] 정렬 문제 풀이 (2)

werthers·2023년 6월 7일
0

CS&Algorithm

목록 보기
9/12
post-thumbnail

좌표 압축

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

주어진 좌표보다 작은 좌표의 갯수를 각각 구하는 문제이다. 조건은 중복이 없어야 한다는 것.

마찬가지로 집합 객체 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 형태로 값과 인덱스를 부여해준다.
  • 입력 배열을 돌며 그 값을 MapKey로 사용하여 각각의 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을 활용하면 조금 더 효율적으로 문제를 풀 수 있기 때문에 꼭 숙지하고 기본적인 각각의 메서드를 숙지하는 것이 좋을 것 같다.


나이 순 정렬

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


해결 방법

  • 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)

소트인사이드

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


해결 방법

  • 처음엔 .sort() 를 사용해 풀면 시간 복잡도가 굉장히 많이 나올 것 같지만 마땅한 방법이 생각이 안나서 고민했다.
  • 0~9 사이의 숫자를 배열의 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);
profile
Hello World !

0개의 댓글

관련 채용 정보