Menu
Coddy logo textTech

조건부 추가: putIfAbsent

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

때때로 Map에 키-값 쌍을 추가해야 할 때가 있지만, 해당 키가 아직 존재하지 않는 경우에만 추가하고 싶을 수 있습니다. putIfAbsent() 메서드는 맵에 키가 없을 때만 항목을 추가하여 이 상황을 완벽하게 처리합니다.

이 메서드는 두 개의 매개변수를 받습니다: 확인할 키와 키가 없을 경우 추가할 값입니다. 키가 이미 존재하면, putIfAbsent()는 아무 작업도 수행하지 않으며 기존 값을 변경하지 않고 그대로 둡니다. 키가 없으면, 맵에 새로운 키-값 쌍을 추가합니다.

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Charlie가 맵에 없으므로 추가합니다
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// Alice가 이미 존재하므로 점수를 변경하지 않습니다
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

putIfAbsent() 메서드는 새 사용자 계정을 설정하거나 특정 키에 대해 작업을 수행하기 전에 해당 키가 존재하는지 확인하는 것과 같이 기본값을 초기화하는 데 특히 유용합니다. 이는 기존 정보를 실수로 덮어쓰지 않고 데이터를 추가하는 안전한 방법입니다.

challenge icon

챌린지

쉬움

플레이어 점수를 추적하고 모든 플레이어가 기본 시작 값을 갖도록 보장하여 게임 토너먼트 등록 시스템을 관리하는 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:

  1. 토너먼트 이름을 나타내는 문자열 입력을 읽습니다.
  2. 플레이어 이름과 현재 점수를 나타내는 여러 쌍의 입력을 읽습니다 (입력은 "scores_done"을 받으면 종료됩니다).
  3. 토너먼트에 참여하려는 새로운 플레이어를 나타내는 여러 문자열 입력을 읽습니다 (입력은 "players_done"을 받으면 종료됩니다).
  4. 플레이어 이름을 키(key)로, 점수를 값(value)으로 저장하는 Map을 생성합니다.
  5. putIfAbsent() 메서드를 사용하여 각 새로운 플레이어를 기본 점수 0으로 추가하되, 이미 등록되지 않은 경우에만 추가합니다.
  6. 토너먼트 통계를 계산하고 아래에 표시된 정확한 형식으로 등록 보고서를 출력합니다.

예를 들어, 토너먼트 이름이 "Spring Championship"이고, 기존 점수에 "Alice" 150점, "Bob" 200점, "Charlie" 75점이 포함되어 있으며, 새로운 플레이어가 "Diana", "Alice", "Eve"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Tournament: Spring Championship
Initial Scores: {Alice: 150, Bob: 200, Charlie: 75}
Registration Process:
Adding Diana: New player registered with score 0
Adding Alice: Player already exists, keeping score 150
Adding Eve: New player registered with score 0
Final Scores: {Alice: 150, Bob: 200, Charlie: 75, Diana: 0, Eve: 0}
Tournament Statistics:
Total registered players: 5
Players with scores above 0: 3
New players added: 2
Average score: 85.0
Status: Registration completed successfully

토너먼트 이름이 "Winter Cup"이고, 기존 점수에 "John" 300점, "Mary" 250점이 포함되어 있으며, 새로운 플레이어가 "Sarah", "Tom", "John"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Tournament: Winter Cup
Initial Scores: {John: 300, Mary: 250}
Registration Process:
Adding Sarah: New player registered with score 0
Adding Tom: New player registered with score 0
Adding John: Player already exists, keeping score 300
Final Scores: {John: 300, Mary: 250, Sarah: 0, Tom: 0}
Tournament Statistics:
Total registered players: 4
Players with scores above 0: 2
New players added: 2
Average score: 137.5
Status: Registration completed successfully

토너먼트 이름이 "Summer League"이고, 기존 점수에 "Alex" 180점, "Jordan" 220점, "Taylor" 160점, "Morgan" 190점이 포함되어 있으며, 새로운 플레이어가 "Casey", "Riley"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Tournament: Summer League
Initial Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190}
Registration Process:
Adding Casey: New player registered with score 0
Adding Riley: New player registered with score 0
Final Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190, Casey: 0, Riley: 0}
Tournament Statistics:
Total registered players: 6
Players with scores above 0: 4
New players added: 2
Average score: 158.33333333333334
Status: Registration completed successfully

프로그램은 반드시 putIfAbsent() 메서드를 사용하여 기본 점수 0으로 새로운 플레이어를 추가해야 하며, 기존 플레이어의 현재 점수는 변경되지 않도록 해야 합니다. 평균 점수는 모든 점수의 합계를 플레이어 수로 나누어 계산합니다. 점수가 0보다 큰 플레이어 수와 실제로 추가된 새로운 플레이어 수(이미 등록된 플레이어 제외)를 계산하세요. 입력 형식은 토너먼트 이름, 그 다음 플레이어 이름과 점수가 번갈아 나오며(정수로 변환해야 하는 문자열 형태), "scores_done"으로 종료된 후, "players_done"으로 종료되는 새로운 플레이어 이름들이 이어집니다.

치트 시트

putIfAbsent() 메서드는 키가 아직 존재하지 않는 경우에만 Map에 키-값 쌍을 추가합니다:

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Charlie가 맵에 없으므로 추가합니다
gameScores.putIfAbsent('Charlie', () => 0);

// Alice가 이미 존재하므로 점수를 변경하지 않습니다
gameScores.putIfAbsent('Alice', () => 0);

이 메서드는 기존 데이터를 덮어쓰지 않고 기본값을 초기화하는 데 유용합니다.

직접 해보기

import 'dart:io';

void main() {
  // 토너먼트 이름 읽기
  String? tournamentName = stdin.readLineSync();
  
  // 플레이어 점수를 저장할 맵 생성
  Map<String, int> playerScores = {};
  
  // 기존 플레이어 점수 읽기
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "scores_done") break;
    
    String playerName = input!;
    String? scoreInput = stdin.readLineSync();
    int score = int.parse(scoreInput!);
    playerScores[playerName] = score;
  }
  
  // 표시를 위해 초기 점수 저장
  Map<String, int> initialScores = Map.from(playerScores);
  
  // 등록할 새로운 플레이어 읽기
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: 아래에 코드를 작성하세요
  // putIfAbsent() 메서드를 사용하여 기본 점수 0으로 새로운 플레이어를 추가하세요
  // 등록 과정을 추적하고 통계를 계산하세요
  
  // 토너먼트 등록 보고서 출력
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // 여기에 등록 과정 상세 내용을 출력하세요
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // 여기에 통계를 출력하세요
  print("Status: Registration completed successfully");
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨