정렬. 10단계
10814번. 나이순 정렬
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const iter = input.shift();
// 가입 순서를 판단하기 위해 input의 인덱스를 원소값에 추가해줌
for(let i = 0; i < iter; i++){
// 문자열 + 숫자 = 문자열
input[i] += " " + i;
}
let arr = [];
for(let i = 0; i < iter; i++){
arr.push(input[i].split(" "));
}
arr.sort((a,b) => {
if(a[0] === b[0]){
return a[2] - b[2]
} else {
return a[0] - b[0]
}
})
let ans = [];
// 가입 순서를 판단하기 위한 인덱스값 원소 삭제
// 배열 맨 뒤에 존재하므로 pop으로 제거
for(let i = 0; i < iter; i++){
arr[i].pop();
// 나이와 이름을 join(" ")으로 연결해서 하나의 문자열로 만든 뒤 ans 배열에 push
ans.push(arr[i].join(" "));
}
console.log(ans.join("\n"));
2차원 배열을 활용해서 풀었는데, 예시를 통해 살펴보는게 이해가 빠르다.
혹시나 2차원 배열의 sort()에 대하여 궁금한 분들은 필자의 백준 11650번 문제 풀이를 참고해주시면 감사하겠습니다.
입력 데이터
3
21 Junkyu
21 Dohyun
20 Sunyoung
맨 처음 나오는 숫자, 3은 반복 횟수로 사용(iter)
만약, 나이가 같으면 가입 순서를 판별해야하는데, 가입 순서는 입력 데이터에 나열된 순서이다.
입력 데이터를 배열로 변환할 때 가지게 되는 인덱스 번호를 가입 순서로 보면 쉽다.
이러한 이유로, 인덱스 번호를 직접 뽑아내서 원소에 넣어줄 것이다.(첫 번째 for문)
input[i] + " " + i === "input[i] i" === 문자열
arr 배열에 새롭게 만든 문자열을 원소로 넣어준다.
단, "21 Junkyu 0"으로 넣으면 각각의 데이터를 활용할 수가 없으므로,
split(" ")을 사용해 배열로 전환해서 넣어야한다.
그렇게 얻게되는 2차원 배열 arr는 다음과 같다.
[[21, "Junkyu", 0],[21, "Dohyun", 1],[20, "Sunyoung", 2]]
sort를 사용하여 나이(type은 number)부터 판별하여 오름차순 정렬을 한다.
만약, 나이가 같으면 인덱스 번호(가입 순서, type은 number)를 판별한다.
이제 정렬이 완료되었다. 그런데, 출력 예시에는 가입 순서(인덱스 번호)가 나오면 안된다.
따라서, 각각의 1차원 배열 맨 뒤에 있는 인덱스 번호를 pop()으로 삭제해준다.
그러면 각각의 1차원 배열은 아래와 같게 변할 것이다.
[21, "Junkyu"]
그리고 그렇게 나온 1차원 배열을 join(" ")을 통해 하나의 문자열로 만든 뒤 ans 배열에 push한다.
ans 배열은 다음과 같을 것이다.
["21 Junkyu", "21 Dohyun", "20 Sunyoung"]
이제 이들을 join("\n")을 통해 하나의 문자열로 만든 뒤 출력한다.
너무나도 간단한건데, 필자가 계속 까먹어서 적어놓기로 했다.
바로 join에 관한 것이다.
join은 아래와 같이 사용하면 안된다.
let arr = [1,2,3];
arr.join(" ");
console.log(arr); // [1,2,3]
왜?? 대충 쓱 보고 지나가면 "1 2 3"이라는 문자열이 될 것만 같은데...?
그렇지않다. 아래와 같이 사용해야한다.
let arr = [1,2,3];
let ans = arr.join(" ");
console.log(ans); // "1 2 3"
왜 이렇게 사용해야할까?
join()은 원본 배열을 건드리지 않기 때문이다.
새로운 배열을 return하기 때문에 그를 다른 변수에 저장해줘야, 불러내서 사용할 수 있는거다.
아무 생각없이 쓰다보면 필자처럼 엉뚱한 에러로 고생하기때문에, 이유를 알고 사용하자!