Set에 추가하기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 33번째.
이제 집합을 만들었으므로, 다음 단계는 집합에 요소를 add하는 방법을 배우는 것입니다. Go의 집합은 실제로 내부적으로 map이므로, 집합에 요소를 add하는 것은 map에 키를 추가하는 것과 동일합니다.
집합에 요소를 add하려면, 빈 구조체 값을 새 키에 간단히 할당하면 됩니다:
colors["yellow"] = struct{}{}struct{}{} 구문은 빈 구조체 리터럴을 생성합니다. 첫 번째 struct{}는 타입을 지정하고, 두 번째 {}는 이를 초기화합니다. 이는 Go에서 집합에 요소를 add하는 표준적인 방법입니다.
이 접근 방식의 장점은 동일한 요소를 다시 add하려고 하면 기존 항목을 단순히 덮어써서 집합의 고유성 속성을 유지한다는 것입니다.
struct{}{}가 이 할당에 사용할 수 있는 유일한 올바른 구문이라는 점에 유의하세요. 타입 이름 없이 {}만 작성하면 컴파일 오류가 발생합니다: missing type in composite literal. 맵 리터럴 외부에서 맵 키에 값을 할당할 때는 항상 타입을 명시적으로 제공해야 합니다.
집합에 요소를 추가하는 작업은 빠르고 간단합니다. Go의 효율적인 map 구현을 활용하면서 고유한 items를 추적하기 위한 진정한 집합 동작을 제공합니다.
챌린지
쉬움Go 집합 관용구를 사용하여 개발자의 기술 능력을 관리하는 기술 추적 시스템을 구축하세요. 이 챌린지는 중복을 방지하고 Learning 진행 상황을 추적하면서 집합에 새로운 기술을 Add하는 방법을 보여줍니다.
두 개의 입력을 받습니다:
- 예상 기술 수를 나타내는 문자열(예:
"5") - 참고용으로만 사용됩니다 - 쉼표로 구분된 기술이 포함된 문자열(예:
"Go,Docker,Kubernetes,Go,React,Docker,Python")
다음 작업을 수행해야 합니다:
- Go 관용구인
map[string]struct{}을 사용하여 고유한 기술을 저장하는 집합을 만듭니다 - 집합을 세 가지 starter 기술인
"Programming","Problem Solving","Communication"으로 Initialize합니다 - 입력 문자열을 쉼표로 분할하여 individual 기술 이름을 가져옵니다
- 쉼표로 구분된 문자열의 ALL 기술을 Process합니다(카운트 매개변수를 사용하지 않고 전체 슬라이스를 Iterate합니다)
- 입력의 각 기술을 값으로
struct{}{}을 사용하여 집합에 Add합니다 - 각 기술을 Process하면서 출력하여 처리 결과를 Display합니다:
- 기술이 집합에 새로 추가된 경우:
"Learning new skill: [skill]" - 기술이 이미 집합에 exists하는 경우:
"Already mastered: [skill]"
- 기술이 집합에 새로 추가된 경우:
- ALL 기술을 Process한 후 progress 요약을 Display합니다:
"Skills processed: [total_processed]"- 기술 슬라이스의 길이를 사용합니다"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- 마지막으로 개발자의 기술 집합에 있는 모든 기술을 나열합니다:
- 헤더:
"Complete skill set:" - 각 기술을 별도의 줄에 표시:
"✓ [skill]"
- 헤더:
중요: 카운트 매개변수가 아니라 슬라이스의 모든 기술을 Iterate하려면 range를 사용하세요. 카운트는 참고용으로 제공되며 loop를 제어해서는 안 됩니다. 입력 문자열을 분할하려면 strings package를 사용하세요. 기술을 Add하기 전에 이미 존재하는지 확인하려면 comma ok 관용구인 _, exists := skillSet[skill]를 사용하세요. 이 챌린지는 Go 집합에 요소를 Add하면 membership testing을 위한 빠른 조회 성능을 제공하면서 uniqueness를 자동으로 처리하는 방법을 보여줍니다.
직접 해보기
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// 입력 읽기
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// count 문자열을 정수로 변환 (참조용 - 루프에서 사용되지 않음)
_, _ = strconv.Atoi(countStr)
// 시작 스킬로 skill set 초기화
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// skills 문자열을 개별 스킬로 분할
skills := strings.Split(skillsStr, ",")
// TODO: 아래에 코드를 작성하세요
// range를 사용하여 슬라이스의 모든 스킬을 순회하며 각 스킬 처리
// comma ok 관용구 사용: _, exists := skillSet[skill]
// 다음을 사용하여 새 스킬 추가: skillSet[skill] = struct{}{}
// 각 스킬의 처리 결과 표시
// len(skills)를 사용하여 진행 요약 계산 및 표시
// List all skills in the complete skill set (consider sorting for consistent output)
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러