Menu
Coddy logo textTech

'firstWhere'로 찾기

Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 15번째.

특정 기준을 충족하는 목록의 특정 요소를 찾아야 할 때, firstWhere() 메서드는 효율적인 해결책을 제공합니다. 일치하는 모든 요소를 반환하는 필터링 메서드와 달리, firstWhere()는 조건을 충족하는 첫 번째 요소를 찾는 즉시 검색을 중단합니다.

firstWhere() 메서드는 각 요소에 대해 true 또는 false를 반환하는 테스트 함수를 인자로 받습니다. 이 메서드는 테스트를 통과하는 첫 번째 요소를 찾을 때까지 요소를 하나씩 검사하며, 해당 요소를 찾으면 즉시 그 요소를 반환합니다.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// 첫 번째 짝수 찾기
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

조건에 일치하는 요소가 없는 경우를 위해, firstWhere()는 선택적인 orElse 매개변수를 제공합니다. 이 매개변수는 일치하는 항목을 찾지 못했을 때 기본값을 반환하는 함수를 전달받아, 프로그램이 오류로 인해 중단되는 것을 방지합니다.

challenge icon

챌린지

쉬움

즉각적인 조치가 필요한 첫 번째 고객 불만 사항을 찾아 고객 서비스 시스템을 관리하는 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:

  1. 부서 이름을 나타내는 문자열 입력을 읽습니다.
  2. 불만 사항의 우선순위 레벨을 나타내는 여러 정수 입력을 읽습니다 (입력은 -1을 받으면 종료됩니다).
  3. 긴급 우선순위 임계값을 나타내는 정수 입력을 읽습니다.
  4. firstWhere() 메서드를 사용하여 긴급 임계값보다 크거나 같은 첫 번째 불만 사항의 우선순위 레벨을 찾습니다.
  5. 아래에 표시된 정확한 형식으로 고객 서비스 결과를 출력합니다.

예를 들어, 부서 이름이 "Technical Support"이고, 우선순위 레벨이 3, 7, 2, 9, 4이며, 긴급 임계값이 8인 경우, 프로그램은 다음과 같이 출력해야 합니다:

Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action required

부서 이름이 "Billing Department"이고, 우선순위 레벨이 4, 6, 3, 5이며, 긴급 임계값이 7인 경우, 프로그램은 다음과 같이 출력해야 합니다:

Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processing

부서 이름이 "Sales Support"이고, 우선순위 레벨이 10, 2, 8이며, 긴급 임계값이 9인 경우, 프로그램은 다음과 같이 출력해야 합니다:

Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action required

프로그램은 firstWhere() 메서드를 사용하여 긴급 임계값보다 크거나 같은 첫 번째 불만 사항 우선순위를 찾아야 합니다. 긴급한 불만 사항을 찾지 못한 경우, 첫 번째 긴급 불만 사항에 "Not found"를 표시하고 상태로 "No urgent complaints - continue normal processing"을 표시합니다. 긴급한 불만 사항을 찾은 경우, 우선순위 레벨을 표시하고 상태로 "Urgent complaint found - immediate action required"를 표시합니다.

치트 시트

firstWhere() 메서드는 특정 조건을 만족하는 리스트의 첫 번째 요소를 찾습니다. 일치하는 요소를 찾는 즉시 검색을 중단하고 해당 요소를 반환합니다.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// 첫 번째 짝수 찾기
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

조건에 일치하는 요소가 없을 때 기본값을 제공하려면 orElse 매개변수를 사용하세요:

// 일치하는 항목이 없으면 기본값을 반환합니다
int result = numbers.firstWhere(
  (number) => number > 100,
  orElse: () => -1
);

직접 해보기

import 'dart:io';

void main() {
  // 부서명 읽기
  String? department = stdin.readLineSync();
  
  // -1이 입력될 때까지 민원 우선순위 레벨 읽기
  List<int> complaints = [];
  while (true) {
    int priority = int.parse(stdin.readLineSync()!);
    if (priority == -1) break;
    complaints.add(priority);
  }
  
  // 긴급 임계값 읽기
  int urgentThreshold = int.parse(stdin.readLineSync()!);
  
  // TODO: 아래에 코드를 작성하세요
  // firstWhere() 메서드를 사용하여 urgentThreshold보다 크거나 같은 첫 번째 민원을 찾으세요
  
  // 결과 출력
  print('Department: $department');
  print('All complaints: $complaints');
  print('Urgent threshold: $urgentThreshold');
  print('Searching for first complaint >= $urgentThreshold');
  // 첫 번째 긴급 민원 결과 출력
  // 상태 메시지 출력
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨