Menu
Coddy logo textTech

값 업데이트하기

Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 32번째.

때때로 해시 맵의 값을 다양한 방식으로 업데이트해야 할 때가 있습니다. 여러분은 이미 .insert()가 기존 값을 덮어쓴다는 것을 배웠지만, 키가 아직 존재하지 않을 때만 값을 추가하고 싶다면 어떻게 해야 할까요?

Rust는 더 정교한 값 업데이트를 위해 .entry() API를 제공합니다. 이 API에서 가장 유용한 메서드는 .or_insert()로, 이는 키가 아직 존재하지 않는 경우에만 값을 삽입합니다:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// 이것은 Alice의 점수를 덮어쓰지 않습니다
scores.entry("Alice").or_insert(90);

// Bob은 맵에 없으므로 Bob의 점수를 추가합니다
scores.entry("Bob").or_insert(90);

.entry() 메서드는 해시 맵에서 이미 점유되었거나 비어 있는 자리를 나타내는 Entry 열거형을 반환합니다. 여기에 .or_insert()를 호출하면, 엔트리가 비어 있는 경우(키가 존재하지 않는 경우)에만 새로운 값을 삽입합니다.

challenge icon

챌린지

쉬움

처리할 플레이어 이름의 수를 나타내는 정수 n을 입력받습니다. 그런 다음 n개의 플레이어 이름을 입력으로 받습니다. 플레이어 점수를 추적하기 위한 해시 맵(타입 HashMap<String, i32>)을 생성하세요. 각 플레이어 이름에 대해, .entry().or_insert()를 사용하여 해당 이름이 맵에 존재하지 않는 경우에만 초기 점수 100으로 추가합니다. 모든 이름을 처리한 후, 각 플레이어와 그들의 점수를 출력하세요.

요구 사항:

  • std::collections에서 HashMap을 가져옵니다.
  • HashMap<String, i32> 타입의 가변(mutable) 해시 맵을 생성합니다.
  • 첫 번째 입력을 읽고 i32로 변환하여 플레이어 이름의 수를 가져옵니다.
  • 루프를 사용하여 n개의 플레이어 이름을 읽습니다.
  • 각 플레이어 이름에 대해, .entry(name).or_insert(100)을 사용하여 맵에 없는 경우 점수 100으로 추가합니다.
  • 모든 이름을 처리한 후, 해시 맵을 순회하며 각 플레이어의 정보를 [name]: [score] 형식으로 출력합니다.

입력:

  • 첫 번째 줄: 정수 n (예: 5)
  • 다음 n개 줄: 플레이어 이름 (예: Alice, Bob, Alice, Charlie, Bob)

출력:

  • 각 고유 플레이어에 대해 한 줄씩 [name]: [score] 형식으로 출력합니다.
  • 출력 줄의 순서는 테스트 실행마다 다를 수 있습니다.

치트 시트

.entry() API는 해시 맵 값을 업데이트하는 정교한 방법을 제공합니다. .or_insert() 메서드는 키가 이미 존재하지 않는 경우에만 값을 삽입합니다:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// This will NOT overwrite Alice's score
scores.entry("Alice").or_insert(90);

// This WILL add Bob's score since he's not in the map
scores.entry("Bob").or_insert(90);

.entry() 메서드는 해시 맵에서 값이 이미 점유되었거나 비어 있는 상태를 나타내는 Entry 열거형(enum)을 반환합니다. .or_insert()를 호출하면, 엔트리가 비어 있을 때(키가 존재하지 않을 때)만 새로운 값을 삽입합니다.

직접 해보기

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // 플레이어 이름의 수를 읽습니다.
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // 플레이어 점수를 저장할 가변 HashMap을 생성합니다.
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: 아래에 코드를 작성하세요.
    // n명의 플레이어 이름을 읽고 .entry().or_insert(100)를 사용하여 맵에 추가합니다.
    
    
    
    // 각 플레이어와 그들의 점수를 [이름]: [점수] 형식으로 출력합니다.
    
}
quiz icon실력 점검

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

Logic & Flow의 모든 레슨