가치투자자

[BOJ] 10814번 : 나이순 정렬 본문

Problem Solving/BOJ

[BOJ] 10814번 : 나이순 정렬

미주민 2023. 4. 2. 20:16
728x90
반응형

백준 10814번 : 나이순 정렬

🔗 문제 링크

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 


💬 문제

 정렬 알고리즘 에 대한 이해가 있다면, 충분히 풀 수 있는 문제다.

 

  1. 1번째 줄에 회원 수 N이 주어진다.
  2. 2번째 줄부터 회원의 나이와 이름이 공백으로 구분되어 "가입순으로" 나열되어 있다.
  3. 회원들을 나이순으로 정렬하고, 나이가 같을 경우엔 "가입순으로" 정렬한다.

 


💡 입력값 받아오기

JavaScript로 풀 경우, 입력값(input)을 어떻게 받아와야 할 지가 중요하다.

이 문제에서는 1번째 줄에 N을 주고, 그 다음줄부터 회원의 나이와 이름이 공백을 기준으로 주어진다.

줄바꿈으로 잘라 N과 회원 정보가 담긴 배열 arr로 나눠주면 된다.

 

 

입력값을 받아오는 것과 관련해 더 자세한 내용은 아래 링크를 참고 바란다.

https://valueengine.tistory.com/2

 

[BOJ] Node.js로 백준(BOJ) 푸는 법 및 VSCode 환경 세팅

1. Node.js fs모듈 사용법 백준에서 JavaScript로 문제를 풀기 위해선 Node.js를 사용해야 하며, 이때 readline 모듈이나 fs 모듈로 입력값(input)을 받아와야 한다. 이 중 속도나 코드의 길이, 작성 편리성에

valueengine.tistory.com

 

728x90

 


🔑 풀이1 : sort()

  • 입력값 input을 회원 수 N과 회원 정보(나이 및 이름)가 담긴 배열 arr로 나눠준다.
  • sort() 메서드로 arr의 요소들을 a, b로 가져와 비교하여 나이순(오름차순)으로 정렬해준다.

    - 이때 나이를 비교해야 하므로, 요소를 공백으로 제거해주고 나이 부분인 0번째 index값을 가져와 비교해준다
    - 0번째 요소는 문자열 타입의 숫자("20")이지만, 각 문자의 유니코드 값에 따라 정렬해준다

  • 처음 주어질때부터 "가입순"으로 주어졌기 때문에, 따로 신경쓰지 않고 정렬해도 된다.
// input값 처리
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
[N, ...arr] = input;

console.log(solution(arr).join('\n'));

function solution(arr) {
  arr = arr.sort((a,b) => a.split(" ")[0] - b.split(" ")[0]);  // 유니코드로 문자열 숫자 비교
  return arr;
}

 

시간은 다음과 같이 걸렸다.

 

 

🎯 풀이를 위한 개념 설명

 유니코드(Unicode) 에 대해 생소할 수 있다.

간단하게 설명하자면, 모든 문자에 특정 번호를 매겨 정리해둔 기준이다. 아래표처럼 특정 문자에 문자순으로 숫자값을 매겨뒀기에 문자도 숫자로 바꿔 정렬할 수 있는 것이다.

 

출처 : https://www.dazhuanlan.com/gustave2454/topics/1744099

 


🔑 풀이2 : sort() 및 parseInt()

  • 입력값 input을 회원 수 N과 회원 정보(나이 및 이름)가 담긴 배열 arr로 나눠준다.
  • sort() 메서드로 arr의 요소들을 a, b로 가져와 비교하여 나이순(오름차순)으로 정렬해준다.

    - parseInt() 메서드로 회원 정보(나이 및 이름)를 정수화하여 나이만 남겨 비교해준다

  • 처음 주어질때부터 "가입순"으로 주어졌기 때문에, 따로 신경쓰지 않고 정렬해도 된다.
// input값 처리
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
[N, ...arr] = input;

console.log(solution(arr).join('\n'));

function solution(arr) {
  arr = arr.sort((a,b) => parseInt(a) - parseInt(b));  // 정수만 남겨주고 오름차순 정렬
  return arr;
}

 

시간은 다음과 같이 걸렸다.

 

 

🎯 풀이를 위한 개념 설명

 parseInt(string, n) 메서드 는 괄호 안에 받은 문자열을 정수로 반환하는 함수이다.

 

  • 문자열 string이 특정 n진법 수일 때, 10진법 정수로 바꿔준다

    - n은 2부터 36까지 입력 가능하며, string만 입력했을 때는 10진법 정수로 변환해준다

  • 공백으로 시작하거나 문자열 사이에 있는 공백은 무시한다
  • 숫자로 시작할 경우 숫자만 출력하며, 문자로 시작하면 NaN(Not a Number)을 출력해준다
  • 띄워쓰기로 숫자가 여러개 있을 경우, 1번째 숫자만 출력해준다
const a = '1.1';
console.log(parseInt(a));  // 1
                           // 소수점을 제외하고 출력
const b = '1010';
console.log(parseInt(b, 2));  // 10
                              // 2진법 수를 10진법으로 변환
const c = ' 5';
console.log(parseInt(b));  // 5
                           // 공백으로 시작하면 공백 무시
const d = '12번';
console.log(parseInt(c));  // 12
                           // 숫자로 시작할 경우, 숫자만 출력
const e = '20 나이';
console.log(parseInt(d));  // 20

const f = '3월 5일';
console.log(parseInt(e));  // 3
                           // 띄어쓰기로 숫자가 여러개가 있을 경우 1번째 숫자만 출력
const g = '나이 30';
console.log(parseInt(f));  // NaN
                           // 문자로 시작하면 NaN 반환

 


🔑 풀이3 : 객체 배열

  • 입력값 input을 회원 수 N과 회원 정보(나이 및 이름)가 담긴 배열 arr로 나눠준다.
  • arr의 각 회원정보(item)를 나이(age)와 이름(name)으로 나누고, 각각을 프로퍼티(property)로 가지는 객체를 생성해준다.
  • 프로퍼티 age로 각 객체에 접근해 나이순으로 정렬한다
  • split로 나이와 이름으로 쪼갰으므로, 정렬된 객체의 요소들을 다시 하나의 문자열로 합쳐주고 출력해준다.
// input값 처리
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
[N, ...arr] = input;

console.log(solution(arr).join('\n'));

function solution(arr) {
  return arr
    // age와 name이라는 프로퍼티를 가진 객체로 전환
    .map((item) => ({ age: parseInt(item.split(" ")[0]), name: item.split(" ")[1] }))
    // age 프로퍼티로 나이순 정렬
    .sort((a, b) => a.age - b.age)
    // 회원정보를 다시 문자열로 전환
    .map((item) => `${item.age} ${item.name}`)
}

 

시간은 다음과 같이 걸렸다.

 


References

 

728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 11004번 : K번째 수  (0) 2023.04.05
[BOJ] 11650번 : 좌표 정렬하기  (0) 2023.04.04
[BOJ] 1427번 : 소트인사이드  (0) 2023.03.31
[BOJ] 1181번 : 단어 정렬  (0) 2023.03.30
[BOJ] 2751번 : 수 정렬하기2  (0) 2023.03.30