// TodoContainer.jsx
const workingTodos = todos.filter((todo) => !todo.isDone);
const doneTodos = todos.filter((todo) => todo.isDone);
// TodoContainer.jsx
<TodoList
isDone={false}
todos={workingTodos} // 미리 필터링해서 넘겨주는 props
deleteTodoHandler={deleteTodoHandler}
toggleTodoHandler={toggleTodoHandler}
/>
<TodoList
isDone={true}
todos={doneTodos} // 미리 필터링해서 넘겨주는 props
deleteTodoHandler={deleteTodoHandler}
toggleTodoHandler={toggleTodoHandler}
/>
기존에는 TodoList 내에서 필터링을 거쳤지만, 애초부터 필터링을 거친 배열을 넣어줘서 더 가독성 측면에서 보기 좋도록 제작해보았다.
해설 영상에 나왔던 대로, TodoItem에서 삭제, 토글 이벤트 함수를 한 번 만들어주려고 했다. 하지만 왜인지 너무 이상하게 되는 것. (완료를 눌렀는데 삭제가 된다거나...) 분명 함수 자체에는 문제가 없는 것 같은데, 왜 이런 식으로 이상하게 나오는거지? 하고 코드를 보다가 한 가지 사실을 깨달았다.
다음 코드를 보면 TodoContainer 내에서 TodoList에 props로 todos를 전달한다는 것을 알 수 있다.
// TodoContainer.jsx
const workingTodos = todos.filter((todo) => !todo.isDone);
const doneTodos = todos.filter((todo) => todo.isDone);
...
<TodoList
title="Working"
btn="완료"
deleteTodoHandler={deleteTodoHandler}
toggleTodoHandler={toggleTodoHandler}
todos={workingTodos}
/>
<TodoList
title="Done"
btn="취소"
deleteTodoHandler={deleteTodoHandler}
toggleTodoHandler={toggleTodoHandler}
todos={doneTodos}
/>
여기서 나는 todos={todos}가 아니라, workingTodos, doneTodos를 todos로 전달했다.
해당 변수들은 todos에서 isDone의 true false 여부로 필터링한 변수들이었던 것... 그래서 todos가 전체 todo들이 나오는게 아닌 필터링된 todos가 나오는 것이었다.
때문에 나는 과제 특성 상 새로운 도전을 하기보다는 과제에 충실히 하는 것이 맞다고 생각해, 기존 방식대로 다시 TodoContainer에 이벤트를 넣어주었다.
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
function solution(n, lost, reserve) {
const filteredReserve = reserve.filter((item) => {
return !lost.includes(item);
});
for (let i = 0; i < lost.length; i++) {
if (filteredReserve.includes(lost[i])) {
filteredReserve.splice(filteredReserve.indexOf(lost[i]), 1);
} else if (filteredReserve.includes(lost[i] - 1)) {
filteredReserve.splice(filteredReserve.indexOf(lost[i] - 1), 1);
} else if (filteredReserve.includes(lost[i] + 1)) {
filteredReserve.splice(filteredReserve.indexOf(lost[i] + 1), 1);
} else {
n--;
}
}
return n;
}
63.3점의 풀이. 우선 lost와 reserve가 정렬이 되어있지 않다는 점, 체육복이 두 벌 있는 학생은 lost와 reserve 둘 모두에서 삭제시켜줘야한다는 점 등 놓친 부분이 많았다. 힌트 페이지가 있는 문제였기에 힌트를 참고했다.
function solution(n, lost, reserve) {
lost.sort((a, b) => a - b);
reserve.sort((a, b) => a - b);
let newLost = [...lost];
let newReserve = [...reserve];
reserve.forEach((item) => {
if (lost.includes(item)) {
newLost.splice(newLost.indexOf(item), 1);
newReserve.splice(newReserve.indexOf(item), 1);
}
});
for (let i = 0; i < newLost.length; i++) {
if (newReserve.includes(newLost[i] - 1)) {
newReserve.splice(newReserve.indexOf(newLost[i] - 1), 1);
} else if (newReserve.includes(newLost[i] + 1)) {
newReserve.splice(newReserve.indexOf(newLost[i] + 1), 1);
} else {
n--;
}
}
return n;
}
정렬이 안 된 케이스가 있을 수 있어 먼저 정렬을 시켜주었고, lost나 reserve 자체를 변경시킬 경우 forEach에서 원치 않는 결과가 나올 수 있어 새로운 배열을 만들어 겹치는 값(여벌의 체육복이 있지만 체육복을 잃어버린 학생)을 삭제해주었다. 그 다음 로직은 새로운 배열을 비교해줬다는 점 빼곤 처음에 만든 로직과 거의 동일하다.