[백준] 2751 수 정렬하기 2

김영현·2024년 9월 4일

백준

목록 보기
3/40
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. N을 Number로 숫자로 바꿔준다.
  2. 1~N 까지(0은 N이기 때문) input의 값을 숫자로 바꿔서 arr 배열에 넣어준다.
  3. arr을 sort로 오른 차순 정렬해준다.
  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. input을 shift함수를 써서 맨앞의 요소인 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
학생의 자세로 살아가는 개발자

0개의 댓글