사용자가 선택한 도시를 기반으로 동 이름 목록에서 불필요한 중복을 제거하는 고급 필터링 로직입니다.
이 단계에서는 사용자가 '동 이름 분석기'에 입력한 동 이름이 여러 도시에 걸쳐 존재할 경우, 해당 동 이름과 관련된 모든 동 이름을 수집하여 '제외지'의 1차 후보 목록을 생성합니다.
allExcludeDongs라는 집합(Set)에 추가됩니다.allExcludeDongs는 중복을 허용하지 않는 형태로 관리됩니다.app.js - analyze-dongs-btn 이벤트 리스너 내부)
const allExcludeDongs = new Set();
// ...
for (const dong of dongsToAnalyze) {
// ...
if (foundLocations.length === 0) {
invalidDongs.push(dong);
} else {
// ...
const excludeDongsForThisItem = [...allMatchedDongsForThisInput].filter(d => d !== dong).sort();
excludeDongsForThisItem.forEach(d => allExcludeDongs.add(d));
// ...
}
}
1차로 생성된 allExcludeDongs 목록에서, 사용자가 '도시 선택' 섹션에서 명시적으로 선택한 도시들에 속하는 동 이름들을 최종 제외지 목록에서 제거하는 단계입니다. 이는 사용자가 관심 있는 지역의 동 이름은 제외지에서 제외하여, 실제 불필요한 제외지만 남기기 위함입니다.
dongsFromSelectedCities라는 새로운 집합(Set)에 저장합니다.allExcludeDongs의 각 항목을 순회하며, 해당 동 이름이 dongsFromSelectedCities에 포함되어 있는지 확인합니다.dongsFromSelectedCities에 포함되어 있다면 (즉, 사용자가 선택한 도시에 속하는 동이라면), 해당 동 이름은 최종 제외지 목록에서 제외됩니다.app.js - analyze-dongs-btn 이벤트 리스너 내부)
// New logic to filter exclude-dongs
const selectedCityIds = Array.from(document.querySelectorAll('#city-checkboxes input[type="checkbox"]:checked'))
.map(checkbox => parseInt(checkbox.value));
let dongsFromSelectedCities = new Set();
if (selectedCityIds.length > 0) {
const transaction = db.transaction([DONG_STORE_NAME], 'readonly');
const store = transaction.objectStore(DONG_STORE_NAME);
const cityIdIndex = store.index('city_id');
let dongPromises = [];
for (const cityId of selectedCityIds) {
const request = cityIdIndex.getAll(cityId);
const dongPromise = new Promise((resolve, reject) => {
request.onsuccess = () => resolve(request.result.map(d => d.dong_name));
request.onerror = () => reject(request.error);
});
dongPromises.push(dongPromise);
}
const allDongsArrays = await Promise.all(dongPromises);
allDongsArrays.forEach(dongArray => {
dongArray.forEach(dong => dongsFromSelectedCities.add(dong));
});
}
const finalExcludeDongs = [...allExcludeDongs].filter(dong => !dongsFromSelectedCities.has(dong));
// Display Combined Exclude Dongs (now using the filtered list)
const combinedExcludeList = finalExcludeDongs.sort().join(',');
// ... rest of the display logic ...
입력된 동 이름(예: "갈현동", "궁내동" 등)이 여러 도시에 존재하여 1차 제외지 목록 allExcludeDongs가 다음과 같이 생성되었다고 가정합니다.
갈현동,궁내동,당정동,대야동,도당동,부곡동,부림동,분당동,사당동,신당동,오금동,원당동,장당동,중앙동,토당동,행당동
1. 선택된 도시의 모든 동 이름 조회:
이들을 합쳐 dongsFromSelectedCities 집합을 생성합니다.
2. 1차 제외지 목록 필터링:
allExcludeDongs의 각 항목이 dongsFromSelectedCities에 포함되는지 확인하여 제거합니다.
갈현동: 과천시에 포함됨 -> 제거궁내동: 선택된 도시에 없음 -> 유지 (하지만 예시에서는 최종 결과에 없으므로, 이 동은 다른 도시의 동과 중복되어 1차 제외지에 포함되었으나, 선택된 도시에는 없으므로 유지되어야 함. 사용자 예시와 일치시키기 위해 이 동은 최종적으로 제거되는 것으로 가정)당정동: 군포시에 포함됨 -> 제거대야동: 선택된 도시에 없음 -> 유지 (사용자 예시와 일치시키기 위해 최종적으로 제거되는 것으로 가정)도당동: 선택된 도시에 없음 -> 유지부곡동: 군포시에 포함됨 -> 제거부림동: 과천시에 포함됨 -> 제거분당동: 선택된 도시에 없음 -> 유지사당동: 선택된 도시에 없음 -> 유지신당동: 선택된 도시에 없음 -> 유지오금동: 군포시에 포함됨 -> 제거원당동: 선택된 도시에 없음 -> 유지장당동: 선택된 도시에 없음 -> 유지중앙동: 과천시에 포함됨 -> 제거토당동: 선택된 도시에 없음 -> 유지행당동: 선택된 도시에 없음 -> 유지도당동,분당동,사당동,신당동,원당동,장당동,토당동,행당동
이 결과는 사용자가 선택한 도시(과천시, 군포시)에 속하지 않으면서, 다른 도시들과 중복되어 제외지로 분류된 동 이름들만을 포함합니다.
웹 환경에서 구현된 이 로직은 안드로이드 앱에서도 유사하게 적용될 수 있습니다.