μžλ°”μŠ€ν¬λ¦½νŠΈ μ•Œκ³ λ¦¬μ¦˜

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 42862] 체윑볡 (Javascript)

은진 2021. 6. 18. 10:33

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œλ§ν¬

문제 μ„€λͺ…
μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€. ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4번 학생은 3번 ν•™μƒμ΄λ‚˜ 5번 ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 체윑볡이 μ—†μœΌλ©΄ μˆ˜μ—…μ„ 듀을 수 μ—†κΈ° λ•Œλ¬Έμ— μ²΄μœ‘λ³΅μ„ 적절히 빌렀 μ΅œλŒ€ν•œ λ§Žμ€ 학생이 μ²΄μœ‘μˆ˜μ—…μ„ λ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

전체 ν•™μƒμ˜ 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” ν•™μƒμ˜ μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­
전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.
μž…μΆœλ ₯ 예
n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2
μž…μΆœλ ₯ 예 μ„€λͺ…
예제 #1
1번 학생이 2번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주고, 3번 ν•™μƒμ΄λ‚˜ 5번 학생이 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 5λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

예제 #2
3번 학생이 2번 ν•™μƒμ΄λ‚˜ 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 4λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

✍️Idea Sketch

2021-06-18

  1. (4번 주의) 학생 iκ°€ μ—¬λ²Œμ˜·λ„ μ±™κΈ°κ³  ν•˜λ‚˜ λ„λ‚œλ‹Ήν•œ 경우, λΉŒλ €μ€„ 수 μ—†μŒ
    • lost.includes(i) === reserve.includes(i) === true
  ls.delete(i)
  rs.delete(i)
  1. λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆλ‹€
  2. μžƒμ–΄λ²„λ¦° 학생이 λ‹€λ₯Έ ν•™μƒμ—κ²Œ 빌릴 수 μžˆλŠ” 상황
    • lost와 reserveμ—μ„œ μ œμ™Έν•˜κΈ°
    • μ€‘λ³΅μ—†λŠ” λ°°μ—΄ Set μ‚¬μš©ν•˜κΈ°
  let ls = new Set(lost);
  let rs = new Set(reserve);
  ls.has(i);
  ls.delete(i);
  ls.size();
  1. μ—¬λ²Œ μ˜·λ„ μ±™κΈ°κ³  ν•˜λ‚˜ λ„λ‚œλ‹Ήν•œ 학생이, λ‹€λ₯Έ ν•™μƒμ—κ²Œ λΉŒλ €μ€¬λ‹€κ³  가정해도, return은 동일함

μ˜ˆμ™Έν…ŒμΌ€ 12번
n lost reserve return output
5 [2, 3, 4] [3, 4, 5] 4 5
3κ³Ό 4λŠ” λΉŒλ €μ€„ 수 μ—†λ‹€. 2λŠ” 5의 μ²΄μœ‘λ³΅μ„ 빌릴 수 μ—†λ‹€.
λ”°λΌμ„œ κΈ°λŒ“κ°’μ€ 4, λ‚΄ μ½”λ“œκ²°κ³ΌλŠ” 5

  1. μ—°μ‚°
  for (let x of ls) {
    if (rs.has(x)) 
    else if (rs.has(x-1))
    else if (rs.has(x+1))
  }
  1. κ²°λ‘ 
  return n - ls.size();

βœοΈμ†ŒμŠ€μ½”λ“œ

2021-06-18 ν…ŒμΌ€ 12번 μ‹€νŒ¨

function solution(n, lost, reserve) {
  let ls = new Set(lost);
  let rs = new Set(reserve);

  for (let x of ls) {
    if (rs.has(x)) {
      ls.delete(x)
      rs.delete(x)
      continue;
    }
    else if (rs.has(x-1)) {
      ls.delete(x)
      rs.delete(x-1)
      continue;
    }
    else if (rs.has(x+1)) {
      ls.delete(x) 
      rs.delete(x+1)
      continue;
    }
  }

  return n - ls.size;
}

2021-06-18 μ •ν™•μ„± 성곡

function solution(n, lost, reserve) {
  let ls = new Set(lost);
  let rs = new Set(reserve);

  for (let x of ls) {
    if (rs.has(x)) {
      ls.delete(x)
      rs.delete(x)
    }
  }

  for (let x of ls) {
    if (rs.has(x-1)) {
      ls.delete(x)
      rs.delete(x-1)
      continue;
    }
    else if (rs.has(x+1)) {
      ls.delete(x) 
      rs.delete(x+1)
      continue;
    }
  }

  return n - ls.size;
}

✍️λͺ…λ‹΅

ν…ŒμΌ€ 12번 μ‹€νŒ¨μ§€λ§Œ λͺ…λ‹΅

function solution(n, lost, reserve) {      
  return n - lost.filter(a => {
      const b = reserve.find(r => Math.abs(r-a) <= 1)  // λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆλ‹€
      if(!b) return true  // λΉŒλ €μ€„ 학생이 μ—†λŠ” 경우, 학생 aλŠ” ν•„ν„° 톡과 <-> λΉŒλ €μ€„ 학생이 μžˆλŠ” 경우, 학생 aλŠ” lostμ—μ„œ μ‚­μ œ
      reserve = reserve.filter(r => r !== b)  // λΉŒλ €μ€„ 학생이 μžˆλŠ” 경우, 학생 bλŠ” reserveμ—μ„œ μ‚­μ œ
  }).length
}
  1. Math.abs() : 주어진 숫자의 μ ˆλŒ€κ°’ λ°˜ν™˜
  Math.abs(null);     // 0, null 봐쀌
  Math.abs(-2);       // 2
  Math.abs('');       // 0, 빈 λ¬Έμžμ—΄ 봐쀌
  Math.abs('-1');     // 1
  Math.abs([]);       // 0, 빈 λ°°μ—΄ 봐쀌
  Math.abs([2]);      // 2
  Math.abs([1,2]);    // NaN, 크기 1 초과 λ°°μ—΄ μ•ˆ 봐쀌
  Math.abs({});       // NaN, 객체 μ•ˆ 봐쀌
  Math.abs('string'); // NaN
  Math.abs();         // NaN, μ•„μ˜ˆ 빈칸 μ•ˆ 봐쀌
  1. arr.filter() : 주어진 쑰건을 ν†΅κ³Όν•˜λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό λͺ¨μ€ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(result);  // expected output: Array ["exuberant", "destruction", "present"]
  • arr.filter() λ‚΄μž₯ν•¨μˆ˜μ—μ„œ return true 의미? --> 톡과! 톡과!
  const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
  const result = words.filter(word => true);
  console.log(result);  // [ 'spray', 'limit', 'elite', 'exuberant', 'destruction', 'present' ]
  • arr.filter() λ‚΄μž₯ν•¨μˆ˜μ—μ„œ return false 의미? --> μ‚­μ œ! μ‚­μ œ!
  const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
  const result = words.filter(word => false);
  console.log(result);  // []
  1. arr.find() : 주어진 쑰건을 ν†΅κ³Όν•˜λŠ” 첫번째 값을 λ°˜ν™˜
const array1 = [5, 12, 8, 130, 44];

const found = array1.find(element => element > 10);

console.log(found);  // expected output: 12