차집합
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 24번째.
때때로 하나의 Set에는 존재하지만 다른 Set에는 존재하지 않는 요소를 찾아야 할 때가 있습니다. difference() 메서드는 두 번째 세트에는 없고 첫 번째 세트에만 있는 요소들만 포함하는 새로운 세트를 생성하여 이 문제를 해결합니다.
이것을 집합에 대한 뺄셈이라고 생각하세요. 첫 번째 집합에서 두 번째 집합의 모든 요소를 제거하는 것입니다. difference() 메서드는 남은 요소들로 구성된 새로운 집합을 반환하며, 원래의 두 집합은 변경되지 않은 상태로 유지합니다.
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}이 연산은 무엇이 누락되었는지, 무엇이 남았는지, 또는 한 컬렉션이 다른 컬렉션과 비교하여 무엇이 고유한지를 찾는 데 특히 유용합니다. 공통점을 찾는 교집합과 달리, 차집합은 한 집합을 다른 집합과 구별되게 만드는 요소를 강조합니다.
챌린지
쉬움계획되었지만 아직 완료되지 않은 작업을 식별하여 프로젝트 관리 시스템을 관리하는 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:
- 프로젝트 이름을 나타내는 문자열 입력을 읽습니다.
- 계획된 작업들을 나타내는 여러 문자열 입력을 읽습니다 (입력은
"planned_done"을 받으면 종료됩니다). - 완료된 작업들을 나타내는 여러 문자열 입력을 읽습니다 (입력은
"completed_done"을 받으면 종료됩니다). - 계획된 작업과 완료된 작업을 저장하기 위해 두 개의 별도 Set을 생성합니다.
difference()메서드를 사용하여 계획되었지만 아직 완료되지 않은 작업을 찾습니다.- 아래에 표시된 정확한 형식으로 프로젝트 상태 분석 결과를 출력합니다.
예를 들어, 프로젝트 이름이 "Website Launch"이고, 계획된 작업이 "Design mockups", "Write content", "Setup database", "Test functionality", "Deploy site"이며, 완료된 작업이 "Design mockups", "Setup database"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remaining만약 프로젝트 이름이 "Mobile App Development"이고, 계획된 작업이 "Create wireframes", "Develop UI", "Implement features"이며, 완료된 작업이 "Create wireframes", "Develop UI", "Implement features"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfully만약 프로젝트 이름이 "Marketing Campaign"이고, 계획된 작업이 "Research target audience", "Create content", "Design graphics", "Launch campaign", "Analyze results"이며, 완료된 작업이 "Research target audience"인 경우, 프로그램은 다음과 같이 출력해야 합니다:
Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remaining프로그램은 반드시 difference() 메서드를 사용하여 계획된 작업 Set에는 존재하지만 완료된 작업 Set에는 존재하지 않는 작업을 찾아야 합니다. 진행률 백분율은 완료된 작업을 전체 계획된 작업으로 나누고 100을 곱하여 계산하며, 소수점 첫째 자리까지 반올림하여 표시합니다. 모든 작업이 완료된 경우 상태를 "Project completed successfully"로 표시하고, 그렇지 않은 경우 "Project in progress - X task(s) remaining"으로 표시합니다 (여기서 X는 남은 작업의 수입니다).
치트 시트
difference() 메서드는 첫 번째 집합에는 존재하지만 두 번째 집합에는 없는 요소들을 포함하는 새로운 집합을 생성합니다:
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}이 연산은 집합에 대한 뺄셈과 같습니다. 첫 번째 집합에서 두 번째 집합의 모든 요소를 제거하고, 두 원본 집합은 변경하지 않은 채 남은 요소들로 구성된 새로운 집합을 반환합니다.
직접 해보기
import 'dart:io';
void main() {
// 프로젝트 이름 읽기
String? projectName = stdin.readLineSync();
// "planned_done"이 입력될 때까지 계획된 작업 읽기
Set<String> plannedTasks = <String>{};
String? task;
while ((task = stdin.readLineSync()) != "planned_done") {
if (task != null) {
plannedTasks.add(task);
}
}
// "completed_done"이 입력될 때까지 완료된 작업 읽기
Set<String> completedTasks = <String>{};
while ((task = stdin.readLineSync()) != "completed_done") {
if (task != null) {
completedTasks.add(task);
}
}
// TODO: 아래에 코드를 작성하세요
// 남은 작업을 찾기 위해 difference() 메서드를 사용하세요
// 진행률 백분율을 계산하세요
// 프로젝트 상태를 결정하세요
// 결과 출력
print("Project: $projectName");
print("Planned tasks: $plannedTasks");
print("Completed tasks: $completedTasks");
// 여기에 나머지 출력 문을 추가하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구