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