μ½”λ”© ν…ŒμŠ€νŠΈ/λ°±μ€€

[λ°±μ€€]JavaScript(nodejs) 1931번 'νšŒμ˜μ‹€ λ°°μ •' 문제 풀이

μš©λ‡½ 2021. 12. 10. 10:57
λ°˜μ‘ν˜•

λ°±μ€€ javascript(node js) 1931번 νšŒμ˜μ‹€ λ°°μ • 문제 풀이

πŸ“– λ“€μ–΄κ°€λ©°

μžλ°”μŠ€ν¬λ¦½νŠΈ(nodejs)둜 λ°±μ€€ 1931번 문제인 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 'νšŒμ˜μ‹€ λ°°μ •' 문제λ₯Ό 풀이해보겠닀.

❓ 문제 

문제 μ„€λͺ…

ν•œ 개의 νšŒμ˜μ‹€μ΄ μžˆλŠ”λ° 이λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” N개의 νšŒμ˜μ— λŒ€ν•˜μ—¬ νšŒμ˜μ‹€ μ‚¬μš©ν‘œλ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€. 각 회의 I에 λŒ€ν•΄ μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ Έ 있고, 각 νšŒμ˜κ°€ κ²ΉμΉ˜μ§€ μ•Šκ²Œ ν•˜λ©΄μ„œ νšŒμ˜μ‹€μ„ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό μ°Ύμ•„λ³΄μž. 단, νšŒμ˜λŠ” ν•œλ²ˆ μ‹œμž‘ν•˜λ©΄ 쀑간에 쀑단될 수 μ—†μœΌλ©° ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” 것과 λ™μ‹œμ— λ‹€μŒ νšŒμ˜κ°€ μ‹œμž‘λ  수 μžˆλ‹€. 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 μˆ˜λ„ μžˆλ‹€. 이 κ²½μš°μ—λŠ” μ‹œμž‘ν•˜μžλ§ˆμž λλ‚˜λŠ” κ²ƒμœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

μž…λ ₯

  • 첫째 쀄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N+1 μ€„κΉŒμ§€ 각 회의의 정보가 μ£Όμ–΄μ§€λŠ”λ° 이것은 곡백을 사이에 두고 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 주어진닀. μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ€ 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.

좜λ ₯

첫째 쀄에 μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

예제 좜λ ₯ 1

4

πŸ’‘ 풀이

그리디 μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œλ‹€. 쑰금만 μƒκ°ν•˜λ©΄ μ‰¬μš΄ 문제인 것 κ°™λ‹€.

μ‹œμž‘ μ‹œκ°„μ΄ λΉ λ₯΄μ§€λ§Œ λλ‚˜λŠ” μ‹œκ°„μ΄ λ„ˆλ¬΄ λŠ¦μ–΄λ²„λ¦¬λ©΄ λ‹€μŒ 회의λ₯Ό ν•˜μ§€ λͺ»ν•˜λŠ” κ²½μš°κ°€ 생길 수 μžˆλ‹€.

κ·Έλž˜μ„œ μ΅œλŒ€ν•œ νšŒμ˜μ‹€μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λλ‚˜λŠ” μ‹œκ°„μ΄ 빨라야 ν•œλ‹€. κ·Έλž˜μ•Ό λ‹€μŒ νšŒμ˜λ“€μ„ μ΅œλŒ€ν•œ μ΄μš©ν•  수 μžˆλ‹€.

μ£Όμ˜μ‚¬ν•­μœΌλ‘œ νšŒμ˜μ‹€μ„ μ΄μš©ν•˜λŠ” μ‹œκ°„μ€ κ²ΉμΉ  수 μ—†λ‹€λŠ” 점도 μœ μ˜ν•œλ‹€.

 

λ¨Όμ € μž…λ ₯ 받은 배열을 λλ‚˜λŠ” μ‹œκ°„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•΄μ€€λ‹€. λŒ€μ‹ μ— λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 경우 μ‹œμž‘ μ‹œκ°„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•΄μ€€λ‹€. λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 κ²½μš°μ—λŠ” 일찍 μ‹œμž‘μ„ ν•΄μ•Ό μ΅œλŒ€ν•œ 더 많이 μ΄μš©μ„ ν•  수 μžˆλ‹€.

 

이제 μ •λ ¬λœ 값듀을 μˆœνšŒν•˜κΈ° 전에 etλΌλŠ” λ³€μˆ˜λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•΄μ€¬λŠ”λ°, 이 λ³€μˆ˜λŠ” μ΅œκ·Όμ— νšŒμ˜μ‹€μ„ μ΄μš©ν•˜κ³  λλ‚˜λŠ” μ‹œκ°„μ„ μ €μž₯ν•  λ³€μˆ˜λ‹€. 0으둜 μ΄ˆκΈ°ν™” ν•¨μœΌλ‘œμ¨ μ •λ ¬λœ 배열을 μˆœνšŒν•  λ•Œ μ΅œμ†Œ 1개 μ΄μƒμ˜ νšŒμ˜μ‹€μ„ μ΄μš©ν•  수 있게 끔 ν•΄μ£Όμ—ˆλ‹€.

 

이제 μ •λ ¬λœ 배열듀을 forEach문을 λŒλ¦¬λŠ”λ° μ‹œμž‘μ‹œκ°„μ΄ λ³€μˆ˜ et(μ΅œκ·Όμ— νšŒμ˜μ‹€μ΄ λλ‚œ μ‹œκ°„)의 값보닀 ν¬κ±°λ‚˜ κ°™λ‹€λ©΄ answer의 값을 증가 μ‹œν‚€λ©΄μ„œ νšŒμ˜μ‹€μ„ μ΄μš©ν•œ 횟수λ₯Ό λˆ„μ μ‹œμΌœμ£Όκ³ , λ³€μˆ˜ et에 μ΄μš©ν•œ νšŒμ˜μ‹€μ˜ λλ‚˜λŠ” μ‹œκ°„μ„ μ €μž₯μ‹œμΌœμ£Όλ©΄μ„œ μ •λ ¬λœ 배열듀을 κ²€μ‚¬ν•˜κ²Œ λœλ‹€.

 

풀이 μ½”λ“œ

const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');

const [n, ...arr] = input;
let answer = 0;
const times = arr
  .map((num) => num.split(' ').map((num) => +num))
  .sort((a, b) => {
    if (a[1] === b[1]) {
      return a[0] - b[0];
    } else {
      return a[1] - b[1];
    }
  });

let et = 0;
times.forEach((time) => {
  if (time[0] >= et) {
    answer++;
    et = time[1];
  }
});

console.log(answer);

βœ” μ±„점

제좜 결과

λ°˜μ‘ν˜•