3 min read

[Level 1] 체윑볡 - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅

Table of Contents

체윑볡 문제 풀이

문제

문제 열어보기

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

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

μ œν•œμ‚¬ν•­

  • 전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2
5[2, 4][2]4

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

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

μž…μΆœλ ₯ 예 #2

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

μž…μΆœλ ₯ 예 #3

μƒλž΅

μž…μΆœλ ₯ 예 #4

khwan μΆ”κ°€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생이 여뢄을 κ°–κ³ μžˆλŠ” μΌ€μ΄μŠ€κ°€ μžˆμœΌλ―€λ‘œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μΆ”κ°€ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
2λ²ˆν•™μƒμ΄ μžƒμ–΄λ²„λ Έμ§€λ§Œ μ—¬λΆ„ λ˜ν•œ κ°€μ§€κ³  μžˆμœΌλ―€λ‘œ 4번 ν•™μƒλ§Œ 체윑볡이 μ—†λŠ” κ²°κ³Όλ₯Ό κ°–κ³ , 총 4λͺ…λ§Œ μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.


풀이

// javascript

function solution(n, lost, reserve) {
  // μˆ˜μ—…μ΄ κ°€λŠ₯ν•œ 학생 = μ „μ²΄ν•™μƒμˆ˜ - μžƒμ–΄λ²„λ¦° 학생
  let answer = n - lost.length;

  for (let i = 0; i < lost.length; i++) {
    for (let j = 0; j < reserve.length; j++) {
      // μžƒμ–΄λ²„λ¦° μ‚¬λžŒμ΄ 여뢄을 κ°–κ³  μžˆλŠ” 경우
      if (lost[i] === reserve[j]) {
        // 각각 λ°°μ—΄μ—μ„œ μ œμ™Έ
        lost.splice(i, 1);
        reserve.splice(j, 1);
        // μˆ˜μ—… κ°€λŠ₯ν•œ 학생 수 증가
        answer++;
        // 배열을 μ‚­μ œν•΄μ€¬κΈ° λ•Œλ¬Έμ— λ‘œμ§μ„ 검증없이 λ„˜μ–΄κ°€λŠ” indexκ°€ μžˆμ„ 수 μžˆμœΌλ―€λ‘œ iλ₯Ό 빼쀌
        i--;
        break;
      }
    }
  }

  for (let i = 0; i < lost.length; i++) {
    for (let j = 0; j < reserve.length; j++) {
      // μžƒμ–΄λ²„λ¦° ν•™μƒμ˜ μ•ž, λ’·λ²ˆν˜Έμ˜ 학생이 여뢄을 κ°–κ³  μžˆλ‹€λ©΄
      if (lost[i] - 1 === reserve[j] || lost[i] + 1 === reserve[j]) {
        // 각각 λ°°μ—΄μ—μ„œ μ œμ™Έ
        lost.splice(i, 1);
        reserve.splice(j, 1);
        // μˆ˜μ—… κ°€λŠ₯ν•œ 학생 수 증가
        answer++;
        // 배열을 μ‚­μ œν•΄μ€¬κΈ° λ•Œλ¬Έμ— 검증없이 λ„˜μ–΄κ°€λŠ” indexκ°€ μžˆμ„ 수 μžˆμœΌλ―€λ‘œ iλ₯Ό 빼쀌
        i--;
        break;
      }
    }
  }

  return answer;
}

μœ„ 처럼 문제λ₯Ό ν’€μ—ˆλŠ”λ°, λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό 보고 λ°˜μ„±ν•˜κ²Œ 됐닀. λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이 쀑 κ°€μž₯ 짧은 풀이와, λ‚΄κ°€ 보기에 κ°€μž₯ 이해가 μ‰¬μš΄ 풀이λ₯Ό 첨뢀해본닀. μ°Έκ³ ν•˜λ©΄μ„œ 곡뢀λ₯Ό 많이 ν•΄μ•Όκ² λ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

κ°€μž₯ 짧은 μ½”λ“œ

function solution(n, lost, reserve) {
  return (
    n -
    lost.filter((a) => {
      const b = reserve.find((r) => Math.abs(r - a) <= 1);
      if (!b) return true;
      reserve = reserve.filter((r) => r !== b);
    }).length
  );
}

λ‚΄ κΈ°μ€€ κ°€μž₯ 이해가 μ‰¬μš΄ μ½”λ“œ

function solution(n, lost, reserve) {
  var answer = new Array(n).fill(1);

  lost.forEach((val) => answer[val - 1]--);
  reserve.forEach((val) => answer[val - 1]++);

  for (let i = 0; i < answer.length; i++) {
    var clothLength = answer[i];

    if (clothLength === 2) {
      if (answer[i + 1] === 0 || answer[i - 1] === 0) {
        answer[i]--;
        answer[i + (answer[i + 1] === 0 ? 1 : -1)]++;
      }
    }
  }

  return answer.filter((x) => x >= 1).length;
}