function friendRecommendations(network, user) {
const targetUser = user;
const directFriends = new Set(network[targetUser]);
const recommendations = new Set();
for (const friend of directFriends) {
for (const friendOfFriend of network[friend]) {
if (friendOfFriend !== targetUser && !directFriends.has(friendOfFriend)) {
recommendations.add(friendOfFriend);
}
}
}
return Array.from(recommendations);
}
const network = {
Alice: ["Bob", "Charlie"],
Bob: ["Alice", "David"],
Charlie: ["Alice", "Eve"],
David: ["Bob"],
Eve: ["Charlie"]
};
console.log(friendRecommendations(network, "Alice"));
function isEmpty(value) {
// 1. null 또는 undefined 처리
if (value === null || value === undefined) return true;
// 2. 원시 타입인 경우 비어있지 않다고 간주
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'symbol' || typeof value === 'bigint') return false;
// 3. 문자열이 빈 문자열일 경우 비어있다고 간주
if (typeof value === 'string') return value === '';
// 4. 배열의 경우 모든 요소가 비어있는지 확인
if (Array.isArray(value)) return value.every(isEmpty);
// 5. 객체의 경우 모든 속성이 비어있는지 확인
if (typeof value === 'object') {
return Object.keys(value).every(key => isEmpty(value[key]));
}
// 그 외의 경우 비어있지 않음
return false;
}
문제를 해결하면서 다양한 접근 방식을 시도해 볼 수 있어서 흥미로웠습니다. 처음에는 직접 친구의 친구들만 탐색하는 방법을 사용했지만, 예상치 못한 오류가 발생해 BFS 탐색을 고려하게 되었습니다. 문제의 조건을 충족하기 위해 중복 처리를 효율적으로 구현하는 방법과, 직접 친구와 간접 친구를 구분하는 로직을 정확히 설계하는 것의 중요성을 깨달았습니다.
이 과정에서 여러 번 코드를 수정하면서 문제를 해결하는 과정이 복잡할 수 있지만, 정확한 요구 사항을 만족하는 코드가 나올 때 큰 성취감을 느낄 수 있었습니다. 이번 경험을 통해 문제 해결 과정에서 다양한 방법을 탐색하고, 효율적인 알고리즘 설계의 중요성을 다시 한번 체감하게 되었습니다.