[백준] 2751 수 정렬하기 2

morecodeplease·2024년 9월 4일
0

백준

목록 보기
3/5
post-thumbnail

🌭 문제 설명

  • 2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

🍗 제한 사항

  • 없음

🎁 입출력 예시

  • 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

😎 나의 풀이

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]));
}
arr.sort((a, b) => a - b);
let answer = '';
for (let i = 0; i < arr.length; i++) {
  answer += arr[i] + '\n';
}

console.log(answer);

  1. NNumber로 숫자로 바꿔준다.
  2. 1~N 까지(0은 N이기 때문) input의 값을 숫자로 바꿔서 arr 배열에 넣어준다.
  3. arrsort로 오른 차순 정렬해준다.
  4. 값을 출력하기 위한 answer를 선언하고 arr을 for문을 돌면서 answer에 줄바꿈 \n을 추가해서 넣어주고 값을 출력한다.

🧵 다른 풀이

let input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map(Number);

let N = input.shift();
let result = "";
// 범위가 -1000000 ~ 1000000 이므로 수는 2000001가지가 나올 수 있다.
let arr = new Array(2000001).fill(0);

// index는 -가 될 수 없기 때문에 +1000000을 해준다.
for(let i = 0; i < N; i++){
    arr[input[i]+1000000]++;
}

for(let i = 0; i < arr.length; i++){
    if(arr[i] === 1) result += `${i-1000000}\n`;
}

console.log(result.trim());
  1. inputshift함수를 써서 맨앞의 요소인 N에 할당하고 결과 값인 result를 선언한다.
  2. 범위가 -1,000,000부터 1,000,000까지 이므로, 모든 가능성을 저장할 수 있는 배열을 만든다. 숫자의 범위가 총 2,000,001 이므로 길이가 2,000,001인 배열 arr을 만든다.
  3. 입력된 각 숫자를 배열 arr에 카운트 한다. input[i] + 1000000을 통해, -1,000,000부터 1,000,000까지의 숫자를 0부터 2,000,000까지의 인덱스에 대응시킨다.
    arr[input[i] + 1000000]++를 통해 등장한 횟수를 1씩 증가한다.
  4. arr 순회하면서, arr[i] === 1인 경우(즉, 해당 숫자가 한 번 등장한 경우) 그 숫자를 result에 추가한다.
    숫자를 문자열로 만들어서 \n(줄바꿈)을 추가한 후, 결과 문자열 result에 더해준다.
  5. trim 으로 불필요한 공백, 줄바꿈을 없애고 출력한다.

  • 다른 분의 풀이를 보니 범위에 대해 명확하게 구분하고 하셨는데 나는 그냥 풀었는데 통과라서 풀이를 보고 많이 배웠다.
profile
Everyday's a lesson

0개의 댓글