🌭 문제 설명
- 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);
N
을 Number
로 숫자로 바꿔준다.
1~N
까지(0은 N이기 때문) input
의 값을 숫자로 바꿔서 arr
배열에 넣어준다.
arr
을 sort
로 오른 차순 정렬해준다.
- 값을 출력하기 위한
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());
input
을 shift
함수를 써서 맨앞의 요소인 N에 할당하고 결과 값인 result
를 선언한다.
- 범위가
-1,000,000
부터 1,000,000
까지 이므로, 모든 가능성을 저장할 수 있는 배열을 만든다. 숫자의 범위가 총 2,000,001
이므로 길이가 2,000,001
인 배열 arr
을 만든다.
- 입력된 각 숫자를 배열
arr
에 카운트 한다. input[i] + 1000000
을 통해, -1,000,000
부터 1,000,000
까지의 숫자를 0
부터 2,000,000
까지의 인덱스에 대응시킨다.
arr[input[i] + 1000000]++
를 통해 등장한 횟수를 1씩 증가한다.
- arr 순회하면서,
arr[i] === 1
인 경우(즉, 해당 숫자가 한 번 등장한 경우) 그 숫자를 result
에 추가한다.
숫자를 문자열로 만들어서 \n(줄바꿈)을 추가한 후, 결과 문자열 result에 더해준다.
trim
으로 불필요한 공백, 줄바꿈을 없애고 출력한다.
- 다른 분의 풀이를 보니 범위에 대해 명확하게 구분하고 하셨는데 나는 그냥 풀었는데 통과라서 풀이를 보고 많이 배웠다.