[Lv.1]체육복 - 질문

Jihyun-Jeon·2022년 3월 23일
0

문제 : https://programmers.co.kr/learn/courses/30/lessons/42862

🔶내가 푼 방법 - 18,20 오류남

  • 질문 - 18,20번 오류나는 이유????
function solution(n, lost, reserve) {
  let cnt = 0;
  
  // 1.lost,reserve에 없는 애는 cnt1
  for (let i = 1; i <= n; i += 1) {
    if (![...lost, ...reserve].includes(i)) {
      cnt += 1;
    }
  }

  // 2.lost,reserve 에서 중복되는 애는 cnt1 하고, 각각의 배열에서 제거하기
  for (const el of lost) {
    if (reserve.includes(el)) {
      cnt += 1;
      lost = lost.filter((d) => d !== el);
      reserve = reserve.filter((d) => d !== el);
    }
  }

  // 3.reserve숫자 앞뒤에 lost 있는지 ? 있으면 cnt2, 해당숫자 제거
  for (const el of reserve) {
    if (lost.includes(el - 1)) {
      cnt += 2;
      lost = lost.filter((d) => d !== el - 1);
      reserve = reserve.filter((d) => d !== el);
    } else if (lost.includes(el + 1)) {
      cnt += 2;
      lost = lost.filter((d) => d !== el + 1);
      reserve = reserve.filter((d) => d !== el);
    } else {
      // 4.reserve에만 남아있는 숫자는 cnt+
      cnt += 1;
    }
  }

  return cnt;
}

🔶다른 사람이 푼 방법
방법1.

function solution(n, lost, reserve) {
  const students = {}; // {1:1 , 2:1 , 3:1 , 4:1 , 5:1}
  let answer = 0; //

  // 1.처음엔 모든 학생들이 체육복1개씩 있음.
  for (let i = 1; i <= n; i += 1) {
    students[i] = 1;
  }

  // 2.잃어버린 사람은 -1씩 , 여분 있는 사람은 +1씩
  lost.forEach((number) => (students[number] -= 1));
  reserve.forEach((number) => (students[number] += 1));

  // 3.여분 있는 학생의 앞뒤를 검색해서, 옷 빌려줌.
  for (let i = 1; i <= n; i += 1) {
    if (students[i] === 2 && students[i - 1] === 0) {
      students[i - 1] += 1;
      students[i] -= 1;
    } else if (students[i] === 2 && students[i + 1] === 0) {
      students[i + 1] += 1;
      students[i] -= 1;
    }
  }

  // 4.students객체를 돌면서 체육복 갖고있는 학생 수 가운트함.
  for (const key in students) {
    if (students[key] >= 1) {
      answer += 1;
    }
  }
  return answer;
}

방법2 -찐으로 lost인 애만 전체에서 빼는 방식 (18번 오류남)

function solution(n, lost, reserve) {
  const realReserve = reserve.filter((r) => !lost.includes(r));
  const realLost = lost.filter((r) => !reserve.includes(r));

  const ableNum = realLost.filter((a) => {
    return realReserve.find((b, i) => {
      const has = b === a - 1 || b === a + 1;
      if (has) {
        delete realReserve[i];
      }
      return has;
    });
  }).length;

  // 전체 - 체육복 못빌린 애
  return n - (realLost.length - ableNum);
}

0개의 댓글