https://school.programmers.co.kr/learn/courses/30/lessons/42576
function solution(participant, completion) {
const participantObj = {};
for (let i = 0; i < participant.length; i++) {
const name = participant[i];
participantObj[name] = participantObj[name] ? participantObj[name] + 1 : 1;
}
for (let i = 0; i < completion.length; i++) {
const name = completion[i];
participantObj[name] -= 1;
}
for (let name in participantObj) {
if (participantObj[name] > 0) {
return name;
}
}
}
객체 생성 및 카운트 업데이트 효율성
participantObj
객체에 참여자 수를 기록하고, 완료자 명단에서 카운트를 줄이는 방식은 합리적입니다. 이는 시간 복잡도가 O(n)으로, 효율적인 방식입니다.
네이밍 개선
participantObj
라는 네이밍은 다소 모호합니다. 객체의 역할을 명확히 나타내는 이름이 더 좋습니다.
의미 있는 초기화 및 결과 반환 루프
첫 번째 루프와 두 번째 루프가 각각 역할을 수행하므로 코드가 이해하기 쉬워집니다. 다만 for...in
루프 대신 Object.keys
로 key들을 순회하면 가독성이 더 좋아질 수 있습니다.
메모리 사용 최적화
이 방식은 메모리 사용을 줄일 수 있으며, 객체 대신 Map
을 활용하여 조금 더 성능을 개선할 수도 있습니다.
의미 있는 변수와 주석 추가
function solution(participant, completion) {
const participantCounts = {};
// 각 참가자의 카운트를 업데이트
for (let i = 0; i < participant.length; i++) {
const name = participant[i];
participantCounts[name] = (participantCounts[name] || 0) + 1;
}
// 완주자 명단에서 참가자 카운트를 줄이기
for (let i = 0; i < completion.length; i++) {
const name = completion[i];
participantCounts[name] -= 1;
}
// 카운트가 남아있는 참가자를 찾기
return Object.keys(participantCounts).find(name => participantCounts[name] > 0);
}
문제: 마라톤에 참가한 선수 중 완주하지 못한 사람을 찾는 문제를 해결했다. 주어진 participant
배열과 completion
배열을 이용해 유일하게 완주하지 못한 한 명의 이름을 찾아내는 것이 목표였다.
해결 방법:
1. 참가자 명단 카운팅: participantCounts
라는 객체에 각 참가자의 이름을 카운팅해 저장했다.
2. 완주자 명단 처리: completion
배열을 순회하면서 참가자 객체의 카운트를 줄였다.
3. 완주하지 못한 사람 찾기: participantCounts
객체에서 값이 1인 사람을 찾았다.
배운 점:
Object.keys
와 find
메서드를 사용해 깔끔하게 남은 참가자를 찾는 방법을 익혔다.