Menu
CoddyTech

'where'로 필터링하기

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

map()이 리스트의 모든 요소를 변환하는 반면, 때로는 특정 기준을 충족하는 요소만 유지하고 싶을 때가 있습니다. where() 메서드를 사용하면 각 요소를 조건에 따라 테스트하고 테스트를 통과한 요소만 유지함으로써 리스트를 필터링할 수 있습니다.

where() 메서드는 각 요소에 대해 true 또는 false를 반환하는 테스트 함수를 인자로 받습니다. true를 반환하는 요소는 결과에 포함되고, false를 반환하는 요소는 필터링되어 제외됩니다.

List<int> scores = [45, 78, 92, 33, 67, 88];

// 50점 이상의 점수만 유지하도록 필터링
var passingScores = scores.where((score) => score > 50);
print(passingScores);  // (78, 92, 67, 88)

이 필터링 방식은 리스트를 수동으로 순회하며 새로운 컬렉션을 구축하는 것보다 훨씬 깔끔합니다. where() 메서드는 데이터 처리의 근본적인 패턴을 나타내며, 추출하는 방법보다는 유지하고 싶은 항목을 선언적으로 지정할 수 있게 해줍니다.

challenge icon

챌린지

쉬움

테스트 점수를 기준으로 학생들을 필터링하여 학생 성적 추적 시스템을 관리하는 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:

  1. 클래스 이름을 나타내는 문자열 입력을 읽습니다.
  2. 학생들의 테스트 점수를 나타내는 여러 개의 정수 입력을 읽습니다 (입력은 -1을 받으면 종료됩니다).
  3. 최소 합격 점수 임계값을 나타내는 정수 입력을 읽습니다.
  4. where() 메서드를 사용하여 임계값보다 크거나 같은 점수만 필터링하여 유지합니다.
  5. 아래에 표시된 정확한 형식으로 필터링 결과를 출력합니다.

예를 들어, 클래스 이름이 "Mathematics 101"이고, 점수가 85, 42, 78, 91, 55, 88이며, 임계값이 70인 경우 프로그램은 다음과 같이 출력해야 합니다:

Class: Mathematics 101
Original scores: [85, 42, 78, 91, 55, 88]
Minimum passing score: 70
Filtering scores >= 70
Passing scores: (85, 78, 91, 88)
Students passed: 4 out of 6
Pass rate: 66.67%

클래스 이름이 "Science Lab"이고, 점수가 45, 38, 52이며, 임계값이 60인 경우 프로그램은 다음과 같이 출력해야 합니다:

Class: Science Lab
Original scores: [45, 38, 52]
Minimum passing score: 60
Filtering scores >= 60
Passing scores: ()
Students passed: 0 out of 3
Pass rate: 0.00%

클래스 이름이 "History"이고, 점수가 95, 88, 92이며, 임계값이 80인 경우 프로그램은 다음과 같이 출력해야 합니다:

Class: History
Original scores: [95, 88, 92]
Minimum passing score: 80
Filtering scores >= 80
Passing scores: (95, 88, 92)
Students passed: 3 out of 3
Pass rate: 100.00%

프로그램은 반드시 where() 메서드를 사용하여 임계값보다 크거나 같은 점수를 필터링해야 합니다. 필터링된 결과는 iterable로서 괄호 형식으로 표시됩니다. 합격률은 (합격 학생 수 / 전체 학생 수) * 100 공식을 사용하여 소수점 둘째 자리까지 백분율로 계산하십시오.

직접 해보기

import 'dart:io';

void main() {
  // 클래스 이름 읽기
  String? className = stdin.readLineSync();
  
  // -1이 입력될 때까지 점수 읽기
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) break;
    scores.add(score);
  }
  
  // 최소 합격 점수 기준 읽기
  int threshold = int.parse(stdin.readLineSync()!);
  
  // TODO: 아래에 코드를 작성하세요
  // where() 메서드를 사용하여 threshold 이상의 점수를 필터링하세요
  
  // 요구된 형식으로 결과 출력
  print('Class: $className');
  print('Original scores: $scores');
  print('Minimum passing score: $threshold');
  print('Filtering scores >= $threshold');
  // 합격 점수, 합격한 학생 수, 합격률 출력
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러