Menu
Coddy logo textTech

Set에서 제거하기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 35번째.

때때로 집합(set)에서 요소를 제거해야 할 때가 있으며, Go에서는 내장된 delete() 함수를 사용하여 이를 간단하게 처리할 수 있습니다. 집합은 실제로 내부적으로 맵(map)이기 때문에, 요소를 제거하는 것은 맵에서 키를 제거하는 것과 정확히 동일하게 작동합니다.

세트에서 요소를 제거하려면 세트와 제거하려는 요소를 delete() 함수와 함께 사용하세요:

delete(colors, "red")

delete() 함수는 두 개의 매개변수를 받습니다: 맵(사용자의 세트)과 제거하려는 키입니다. 요소가 세트에 존재하면 제거됩니다. 요소가 존재하지 않으면 함수는 아무 작업도 수행하지 않으며 오류가 발생하지 않습니다.

이 동작은 집합(sets)에 완벽합니다. 왜냐하면 처음에 요소가 있었는지 여부와 관계없이 요소가 존재하지 않음을 보장하고 싶은 경우가 많기 때문입니다. 이 작업은 빠르고 효율적이며, Go의 내부 map 구현의 성능 이점을 유지합니다.

challenge icon

챌린지

쉬움

Go의 세트(set) 관용구를 사용하여 다양한 장르 컬렉션에서 책을 제거하는 도서관 도서 관리 시스템을 구축하세요. 이 챌린지는 제거 프로세스를 추적하면서 세트에서 요소를 제거하기 위해 delete() 함수를 사용하는 방법을 보여줍니다.

두 개의 입력을 받게 됩니다:

  • 쉼표로 구분된 소설 컬렉션의 도서가 포함된 문자열 (예: "1984,Dune,Foundation,Neuromancer,Brave New World")
  • 쉼표로 구분된 제거할 도서가 포함된 문자열 (예: "Dune,Harry Potter,Foundation,Twilight,1984")

당신의 과제는 다음과 같습니다:

  1. Go의 관용구인 map[string]struct{}를 사용하여 소설 도서를 저장할 세트를 생성합니다.
  2. 첫 번째 입력 문자열을 쉼표로 분할하여 개별 도서 제목을 가져와 파싱합니다.
  3. 빈 구조체 리터럴 {}를 값으로 사용하여 각 도서를 세트에 추가합니다.
  4. 두 번째 입력 문자열을 쉼표로 분할하여 제거할 도서 목록을 가져와 파싱합니다.
  5. 제거할 각 도서에 대해 comma ok 관용구를 사용하여 세트에 존재하는지 확인합니다.
  6. 처리 중인 각 도서에 대한 제거 프로세스를 표시합니다:
    • 도서가 컬렉션에 존재하는 경우: "Removing: [book_title]"
    • 도서가 컬렉션에 존재하지 않는 경우: "Not found: [book_title]"
  7. delete() 함수를 사용하여 세트에 존재하는 도서를 제거합니다.
  8. 모든 제거 요청을 처리한 후 요약을 표시합니다:
    • "Initial collection size: [initial_count]"
    • "Removal requests: [requests_count]"
    • "Books successfully removed: [removed_count]"
    • "Books not found: [not_found_count]"
    • "Final collection size: [final_count]"
  9. 마지막으로 컬렉션에 남은 모든 도서를 나열합니다:
    • 헤더: "Remaining books in fiction collection:"
    • 각 도서를 별도의 줄에 표시: "- [book_title]"
    • 남은 도서가 없는 경우: "- Collection is empty"

strings 패키지를 사용하여 입력 문자열을 쉼표로 분할하세요. 이 챌린지는 delete() 함수가 Go 세트에서 요소를 안전하게 제거하는 방법을 보여줍니다. 존재하지 않는 요소를 제거하려고 시도해도 오류가 발생하지 않으므로 정리 작업에 적합합니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strings"
)

func main() {
	// 공백이 포함된 도서 제목을 지원하기 위해 Scanner를 사용하여 입력 읽기
	scanner := bufio.NewScanner(os.Stdin)

	scanner.Scan()
	fictionBooks := scanner.Text()
	scanner.Scan()
	booksToRemove := scanner.Text()

	// 입력 문자열 파싱
	fictionList := strings.Split(fictionBooks, ",")
	removeList := strings.Split(booksToRemove, ",")

	// TODO: 아래에 코드를 작성하세요
	// 1. 소설 책을 저장하기 위해 map[string]struct{}를 사용하여 세트 생성
	// 2. fictionList의 각 도서를 세트에 추가
	// 3. removeList의 각 도서를 처리하고 존재 여부 확인
	// 4. 제거 과정을 표시하고 delete() 함수 사용
	// 5. 요약 통계 표시
	// 6. 컬렉션에 남은 도서 목록 나열
	// 일관된 출력을 위해 남은 도서를 정렬해야 함을 기억하세요

	_ = sort.Strings // sort를 사용하면 이 라인을 제거하세요
	_ = fmt.Println  // fmt를 사용하면 이 라인을 제거하세요
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨