Menu
Coddy logo textTech

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) 동작을 제공합니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

Go의 set 관용구(idiom)를 사용하여 개발자의 기술 능력을 관리하는 기술 추적 시스템을 구축하세요. 이 챌린지는 중복을 방지하고 학습 진행 상황을 추적하면서 set에 새로운 기술을 추가하는 방법을 보여줍니다.

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

  • 예상되는 기술의 수를 나타내는 문자열 (예: "5") - 이는 참조용으로만 제공됩니다.
  • 쉼표로 구분된 기술들이 포함된 문자열 (예: "Go,Docker,Kubernetes,Go,React,Docker,Python")

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

  1. 고유한 기술 능력을 저장하기 위해 Go 관용구인 map[string]struct{}를 사용하여 set을 생성합니다.
  2. 세 가지 기본 기술로 set을 초기화합니다: "Programming", "Problem Solving", 그리고 "Communication"
  3. 입력 문자열을 쉼표 기준으로 분리하여 개별 기술 이름을 얻도록 파싱합니다.
  4. 쉼표로 구분된 문자열의 모든 기술을 처리합니다 (count 매개변수를 사용하지 않고 전체 슬라이스를 반복합니다).
  5. 입력받은 각 기술에 대해, struct{}{}를 값으로 사용하여 set에 추가합니다.
  6. 각 기술이 처리될 때마다 다음을 출력하여 처리 결과를 표시합니다:
    • set에 새로 추가되는 기술인 경우: "Learning new skill: [skill]"
    • 이미 set에 존재하는 기술인 경우: "Already mastered: [skill]"
  7. 모든 기술을 처리한 후, 진행 요약을 표시합니다:
    • "Skills processed: [total_processed]" - 기술 슬라이스의 길이를 사용합니다.
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. 마지막으로, 개발자의 기술 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)를 사용하여 진행 상황 요약 계산 및 표시
	// 전체 기술 세트의 모든 기술 목록 표시 (일관된 출력을 위해 정렬 고려)
	
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨