쌍 삭제하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 33번째.
때로는 해시 맵에서 데이터를 완전히 제거해야 할 때가 있습니다. Rust는 키를 지정하여 키-값 쌍을 삭제하는 .remove() 메서드를 제공합니다:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// "apples" 항목을 완전히 제거합니다
inventory.remove("apples");.remove() 메서드는 키를 매개변수로 받아 해시 맵에서 키와 그에 연관된 값을 모두 제거합니다. .remove("apples")를 호출한 후, "apples"를 조회하려고 하면 None이 반환됩니다.
많은 해시 맵 연산들과 마찬가지로, .remove()는 Option을 반환합니다. 키가 존재했다면 삭제된 값을 포함하는 Some(value)를 반환하고, 키를 찾지 못했다면 None을 반환합니다:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}이 반환 값은 삭제가 성공했는지 여부를 알려주며, 삭제된 값에 접근할 수 있게 해줍니다. 이는 로깅이나 정리 작업에 유용할 수 있습니다.
챌린지
쉬움인벤토리의 아이템 개수를 나타내는 정수 n을 입력받습니다. 그런 다음 n 쌍의 입력(아이템 이름과 정수 형태의 수량)을 받습니다. 그 후, 인벤토리에서 삭제할 아이템 이름을 하나 더 입력받습니다. 인벤토리를 저장할 해시 맵을 생성하고, 모든 아이템을 삽입한 뒤, 지정된 아이템을 삭제하고 삭제 결과와 남은 인벤토리를 출력하세요.
요구 사항:
std::collections에서HashMap을 가져옵니다.HashMap<String, i32>타입의 가변(mutable) 해시 맵을 생성합니다.- 첫 번째 입력을 읽고
i32로 변환하여 아이템 개수를 가져옵니다. - 루프를 사용하여
n쌍의 입력(아이템 이름, 수량 순)을 읽습니다. - 각 아이템과 수량을 해시 맵에 삽입합니다.
- 삭제할 아이템 이름으로 입력을 하나 더 읽습니다.
- 해시 맵에서 아이템을 삭제하기 위해
.remove()를 사용합니다. .remove()가 반환하는Option을 처리하기 위해match를 사용합니다.- 아이템을 찾아 삭제한 경우,
Removed [quantity] [item_name]를 출력합니다. - 아이템을 찾지 못한 경우,
[item_name] not found를 출력합니다. - 삭제 처리가 끝난 후, 남은 해시 맵을 순회하며 각 아이템을
[item_name]: [quantity]형식으로 출력합니다.
입력:
- 첫 번째 줄: 정수
n(예:3) - 다음
n쌍의 줄:- 아이템 이름 (예:
apples) - 정수 형태의 수량 (예:
50)
- 아이템 이름 (예:
- 마지막 줄: 삭제할 아이템 이름 (예:
bananas)
출력:
- 첫 번째 줄:
Removed [quantity] [item_name]또는[item_name] not found중 하나 - 다음 줄들: 남은 각 아이템에 대해
[item_name]: [quantity]형식으로 한 줄씩 출력 - 남은 아이템의 출력 순서는 테스트 실행마다 다를 수 있습니다.
치트 시트
해시 맵에서 키-값 쌍을 제거하려면, 키를 매개변수로 사용하는 .remove() 메서드를 사용하세요:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
inventory.remove("apples");.remove() 메서드는 Option을 반환합니다. 키가 존재했다면 Some(value)를, 찾지 못했다면 None을 반환합니다:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}직접 해보기
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();
// 인벤토리를 저장할 가변 해시 맵을 생성합니다
let mut inventory: HashMap<String, i32> = HashMap::new();
// n개의 입력 쌍(아이템 이름과 수량)을 읽습니다
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: 아이템과 수량을 해시 맵에 삽입하세요
}
// 삭제할 아이템 이름을 읽습니다
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: 해시 맵에서 아이템을 삭제하고 match를 사용하여 결과를 처리하세요
// 삭제 결과 출력 ("Removed [quantity] [item_name]" 또는 "[item_name] not found" 중 하나)
// TODO: 남은 인벤토리를 반복하여 각 아이템을 "[item_name]: [quantity]" 형식으로 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.